gpt4 book ai didi

c# - 仅当匹配文件存在时才移动文件

转载 作者:行者123 更新时间:2023-11-30 17:44:14 25 4
gpt4 key购买 nike

我有一个应用程序需要两个文件来处理数据。一个包含实际数据的 zip 文件,然后是一个说明如何处理所述数据的控制文件。

这些文件通过 sftp 下载到暂存目录。 zip 文件完成后,我需要检查控制文件是否也存在。它们仅共享一个命名前缀(例如,100001_ABCDEF_123456.zip 与 100001_ABCDEF_control_file.ctl 配对。

我正在尝试找到一种方法来等待 zip 文件完成下载,然后即时移动文件,同时保持目录结构,因为这对下一步处理很重要。

目前我正在等待 sftp worker 完成,然后调用 robocopy 来移动所有内容。我想要一种更完善的方法。

我试过很多东西,结果都一样。文件下载但从不移动。出于某种原因,我无法让比较正常工作。

我曾尝试使用 FileSystemWatcher 寻找从 filepart 到 zip 的重命名,但它似乎错过了几次下载,并且由于某种原因,当我到达我的 foreach 以搜索控制文件的目录时,该功能消失了。下面是 FileSystemWatcher 事件,我将其称为创建和更改。下面还有 filesystemwatcher 的设置。

        watcher.Path = @"C:\Sync\";
watcher.IncludeSubdirectories = true;
watcher.EnableRaisingEvents = true;
watcher.Filter = "*.zip";
watcher.NotifyFilter = NotifyFilters.Attributes |
NotifyFilters.CreationTime |
NotifyFilters.FileName |
NotifyFilters.LastAccess |
NotifyFilters.LastWrite |
NotifyFilters.Size |
NotifyFilters.Security |
NotifyFilters.CreationTime |
NotifyFilters.DirectoryName;
watcher.Created += Watcher_Changed;
watcher.Changed += Watcher_Changed;

private void Watcher_Changed(object sender, FileSystemEventArgs e)
{
var dir = new DirectoryInfo(e.FullPath.Substring(0, e.FullPath.Length - e.Name.Length));
var files = dir.GetFiles();

FileInfo zipFile = new FileInfo(e.FullPath);

foreach (FileInfo file in files)
{
MessageBox.Show(file.Extension);
if (file.Extension == "ctl" && file.Name.StartsWith(e.Name.Substring(0, (e.Name.Length - 14))))
{
file.CopyTo(@"C:\inp\");
zipFile.CopyTo(@"C:\inp\");
}
}
}

最佳答案

Watcher_Changed 会因各种各样的事情而被调用,并不是每次它被调用时你都想对它使用react。

您应该在事件处理程序中做的第一件事是尝试以独占方式打开 zipFile。如果您做不到,请忽略此事件并等待另一个事件。如果这是一个 FTP 服务器,每次将新数据 block 写入磁盘时,您都会收到一个更改事件。您还可以将某些内容放在“重试”队列中,或使用其他机制来检查该文件稍后是否可用。我在我们的系统中有类似的需求,我们在发现第一个变化后每 5 秒尝试一次。只有当我们可以以独占方式打开文件进行写入时,我们才允许它继续下一步。

我会加强您对文件名的假设。您将搜索限制为 *.zip,但不仅仅依赖于该目标目录中存在的 .zip 文件。验证您对文件名所做的解析没有遇到意外值。您可能还想在调用 dir.GetFiles() 之前检查 dir.Exists()。那可能会抛出异常。

关于丢失的事件,请参阅关于缓冲区溢出的这个很好的答案:FileSystemWatcher InternalBufferOverflow

关于c# - 仅当匹配文件存在时才移动文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29928465/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com