我可以等到我的文件创建,以便使用FileSystemWatcher处理此文件吗?

时间:2012-12-25 14:47:28

标签: c#

我的应用程序正在监听目录和创建的每个新文件需要处理,所以我做了一个测试并听我的文件夹,看看如果我将大文件移动到这个文件夹中,事件在整个文件创建之前被触发这可能会导致我的问题。 我可以等到创建所有文件吗?

public void startListener(string directoryPath)
{
    FileSystemWatcher watcher = new FileSystemWatcher(directoryPath);
    watcher.Filter = "*.avi";
    watcher.Created += watcher_Created;
    watcher.EnableRaisingEvents = true;
}

void watcher_Created(object sender, FileSystemEventArgs e)
{

}

2 个答案:

答案 0 :(得分:0)

根据MSDN docs,当文件从一个目录复制到另一个目录时,可能会生成多个OnCreate()OnChanged()个事件。

我们需要在这里区分两种情况:

  • 您正在自行复制文件,因此您可以控制复制的完成方式。

    在这种情况下,在所需文件夹中使用没有.avi扩展名的临时文件名是最有效的(例如,您可以使用filename.avi.tmp代替filename.avi),完成复制后,使用.avi扩展名将其重命名为正确的名称。

    然后,您订阅Renamed事件并观察重命名为.avi的文件。

  • 如果您无法控制复制,则可以使用another answer to this question

  • 中描述的技巧之一

答案 1 :(得分:0)

我认为您可以做的是处理OnCreated事件,方法是将“新创建的”文件添加到本地List

然后在OnChanged上,这将在更新片段时触发,检查文件是否在新创建的文件列表中,并尝试独占打开文件,执行以下操作:

File.Open("someFile.avi", FileMode.Open, FileAccess.Read, FileShare.None)

如果您获得IOException,该文件仍在使用中。

您可以使用重命名事件在此评论中描述另一件事: https://stackoverflow.com/a/5894697/1373170

事实上,整个SO问题可能会为您提供有用的信息: C# FileSystemWatcher, How to know file copied completely into the watch folder