监视创建的 zip 文件时,fileSystemWatcher 不起作用

Posted

技术标签:

【中文标题】监视创建的 zip 文件时,fileSystemWatcher 不起作用【英文标题】:fileSystemWatcher doesn't work when watching for created zip files 【发布时间】:2021-09-14 11:35:54 【问题描述】:

我一直在使用 c# 的 fileSystemWatcher 来跟踪下载 zip 文件的时间,问题是文件名永远不会输出到 result.Name。这是为什么呢??

public ResultsDetails ExportCallsToCsv()
            
                var downloadsDirectory = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile) + @"\Downloads";
                ExportToCsvButton.Click();
                using (var watcher = new FileSystemWatcher(downloadsDirectory))
                
                    watcher.Filter = "*.zip";
                    var result = watcher.WaitForChanged(WatcherChangeTypes.Created, 10000);
                    CsvFilePath = $@"downloadsDirectory\result.Name".Replace("_", "-");
                
    return new ResultsDetails(ActionResult.Passed, "Csv file created succesfully.");
            

为什么 result.Name 永远不会被填写?我试图在 using 块内放置一个无限循环,当 result.Name 被填充时会中断,但仍然无济于事。当我这样做时,它会永远停止。

【问题讨论】:

这是什么:ExportToCsvButton.Click();(同步)在做什么?路径是否正确?您是否尝试过其他(非特殊)路径? 我建议尝试使用其他 WatcherChangeTypes 值,或删除 "*.zip" Filter。可能创建的文件最初具有不同的扩展名,压缩完成后重命名为.zip 该按钮将包含 csv 的 zip 文件下载到下载位置 按钮事件处理程序是否完成下载?还是只是启动它? 它只是启动它 【参考方案1】:

FileSystemWatcher.WaitForChanged 是一种同步/阻塞方法,无法捕获在同一线程上触发的文件更改。

这是一个小型测试程序中的代码示例。这行不通(正如您所指出的)。

 static void Main(string[] args)
    
        var directory = "C:\\test";
        File.Copy("C:\\test\\source.txt", "C:\\test\\new_file.txt");

        using (var watcher = new FileSystemWatcher(directory))
        
            watcher.Filter = "*.txt";
            var result = watcher.WaitForChanged(WatcherChangeTypes.Created, 10000);
            if (result.Name is null)
            
                // This is always printed.
                Console.WriteLine("No name");
            
        

        Console.ReadLine();
    

这是一个可以运行的小示例程序。此版本异步处理 FileSystemWatcher 事件。

    static void Main(string[] args)
    
        var directory = "C:\\test";

        using (var watcher = new FileSystemWatcher(directory, "*.txt"))
        
            watcher.EnableRaisingEvents = true; // *** Be sure to include this!
            watcher.Created += Watcher_Created; // *** This is different, too.

            File.Delete("C:\\test\\new_file.txt");
            File.Copy("C:\\test\\source.txt", "C:\\test\\new_file.txt");
        


        Console.WriteLine("All done.");
        Console.ReadLine();
    

    private static void Watcher_Created(object sender, FileSystemEventArgs e)
    
        Console.WriteLine($"Detected e.Name is e.ChangeType.");
    

【讨论】:

啊。我正在使用无法异步运行的测试框架。看起来我将不得不使用 Thread.Sleep() 来等待文件下载。谢谢 问题不只是文件是在您开始关注它之前创建的吗? 没有。无论何时按下下载按钮,都不会检测到更改 在使用事件驱动版本时,不能使用using 语句声明FileSystemWatcher。你会在之后立即处理它。 @jamie 请参阅我上面的评论:删除 using 块。另请注意,功能与同步版本相同。如果同步创建存档,则仅在创建文件后才初始化观察程序。如果您事先初始化事件驱动的观察者,您会遇到并发问题,因为通知是在创建文件时生成的,但它可能(不会)被完全写入。

以上是关于监视创建的 zip 文件时,fileSystemWatcher 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Java:监视目录以移动大文件

linux 创建zip文件时 提示超过4g 怎么办

监控 Zip4J extractAll() 方法进度监控

创建 zip 存档时,啥构成重复条目

使用 7zip 创建 Zip 时如何计算 MD5 哈希

如何在 C# 中使用 Ionic-zip 下载大文件时修复 zip 文件损坏错误