我正在使用FileSystemWatcher,当我将文件复制到此目录时,它使用Created事件进行侦听。这个方法如下:
private void fileSystemWatcher1_Created(object sender, System.IO.FileSystemEventArgs e)
{
System.IO.Directory.Move(fileSystemWatcher1.Path+@"\"+e.Name, fileSystemWatcher1.Path + @"\Processing\"+e.Name);
}
问题是如果我将一个大文件复制到这个目录中,这样复制大约需要30秒,只要将第一个字节写入文件夹并尝试移动正在运行的文件,就会调用此方法由另一个进程使用,所以失败。
有什么想法吗?
感谢
答案 0 :(得分:2)
在这种情况下,我喜欢让复制过程使用临时文件名移动文件,观察者无法识别。
然后我将文件重命名为真实姓名。重命名只需要很少的时间,并且不会导致文件“正在使用”。
答案 1 :(得分:2)
您可能需要结合使用几种解决方案才能实现这一目标。
当事件触发时,启动计时器等待一段时间(30秒?),以便文件创建有时间完成。然后将文件移开。
陷阱错误并稍后重试。
或者当文件到达时将其名称添加到队列中,然后有一个单独的进程将文件从队列中移出。在这种情况下,如果您收到“正在使用的文件”错误,您只需将文件读取到队列的后面,这样就可以有更多的时间来完成。
答案 2 :(得分:1)
也许您可以通过收听“已更改”事件来执行此操作,并且仅在冷静期后尝试复制文件。也就是说,在收到“已创建”后,请在复制文件前等待5秒,并在每次收到更改事件时将时间重置为零。
答案 3 :(得分:1)
我做到了:
while(true){
try
{
using (Stream stream = new FileStream("MyFilename.txt"))
{
break;
}
} catch {
Thread.Sleep(1000);
}
}
它好像在做这个工作