从C#中观察文件夹移动文件#

问题描述:

我正在使用FileSystemWatcher,它使用Created事件来侦听将文件复制到此目录中的时间。这种方法如下:从C#中观察文件夹移动文件#

private void fileSystemWatcher1_Created(object sender, System.IO.FileSystemEventArgs e) 
{ 
    System.IO.Directory.Move([email protected]"\"+e.Name, fileSystemWatcher1.Path + @"\Processing\"+e.Name); 
} 

的问题是,如果我复制一个大文件到这个目录中,例如,它需要大约30秒的复制,这种方法只要第一个字节写入到文件夹名为并尝试移动另一个进程正在使用的文件失败。

有什么想法?

感谢

在这样的情况下,我想有复制过程的文件搬过来使用,不会被观察者识别的临时文件名。

然后我将文件重命名为它的真名。重命名需要很少的时间,不会导致文件被“使用”。

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

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

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

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

也许你可以通过听“Changed”事件来做到这一点,并且只能在冷静期后尝试复制文件。也就是说,在收到“创建”之后,在复制文件之前等待5秒钟,并在每次收到更改事件时将时间重置为零。

我已经这样做了:

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

似乎做的工作