在C#中从监视文件夹中移动文件

时间:2010-10-23 17:16:55

标签: c# move filesystemwatcher

我正在使用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秒,只要将第一个字节写入文件夹并尝试移动正在运行的文件,就会调用此方法由另一个进程使用,所以失败。

有什么想法吗?

感谢

4 个答案:

答案 0 :(得分:2)

在这种情况下,我喜欢让复制过程使用临时文件名移动文件,观察者无法识别。

然后我将文件重命名为真实姓名。重命名只需要很少的时间,并且不会导致文件“正在使用”。

答案 1 :(得分:2)

您可能需要结合使用几种解决方案才能实现这一目标。

  1. 当事件触发时,启动计时器等待一段时间(30秒?),以便文件创建有时间完成。然后将文件移开。

  2. 陷阱错误并稍后重试。

  3. 或者当文件到达时将其名称添加到队列中,然后有一个单独的进程将文件从队列中移出。在这种情况下,如果您收到“正在使用的文件”错误,您只需将文件读取到队列的后面,这样就可以有更多的时间来完成。

答案 2 :(得分:1)

也许您可以通过收听“已更改”事件来执行此操作,并且仅在冷静期后尝试复制文件。也就是说,在收到“已创建”后,请在复制文件前等待5秒,并在每次收到更改事件时将时间重置为零。

答案 3 :(得分:1)

我做到了:

while(true){
  try
  {
     using (Stream stream = new FileStream("MyFilename.txt"))
     {
        break;
     }
  } catch {
     Thread.Sleep(1000);
  }
}

它好像在做这个工作