0

我正在使用 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

4 回答 4

3

您可能需要结合几个解决方案才能使其正常工作。

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

  2. 捕获错误并稍后重试。

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

于 2010-10-23T17:20:28.980 回答
2

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

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

于 2010-10-23T17:19:09.410 回答
1

也许您也可以通过监听“Changed”事件来做到这一点,并且只在冷静期后尝试复制文件。即收到“Created”后,等待5秒再复制文件,每次收到Changed事件时将时间归零。

于 2010-10-23T17:20:32.997 回答
1

我已经这样做了:

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

它似乎完成了这项工作

于 2010-10-23T17:50:21.457 回答