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