监视创建的 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 不起作用的主要内容,如果未能解决你的问题,请参考以下文章