Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C中从关注的文件夹移动文件#_C#_Move_Filesystemwatcher - Fatal编程技术网

C# 在C中从关注的文件夹移动文件#

C# 在C中从关注的文件夹移动文件#,c#,move,filesystemwatcher,C#,Move,Filesystemwatcher,我使用的是FileSystemWatcher,当我将文件复制到此目录时,它使用创建的事件来侦听。该方法如下: private void fileSystemWatcher1_Created(object sender, System.IO.FileSystemEventArgs e) { System.IO.Directory.Move(fileSystemWatcher1.Path+@"\"+e.Name, fileSystemWatcher1.Path + @"\Processing\

我使用的是FileSystemWatcher,当我将文件复制到此目录时,它使用创建的事件来侦听。该方法如下:

private void fileSystemWatcher1_Created(object sender, System.IO.FileSystemEventArgs e)
{
   System.IO.Directory.Move(fileSystemWatcher1.Path+@"\"+e.Name, fileSystemWatcher1.Path + @"\Processing\"+e.Name);
}
问题是,如果我将一个大文件复制到此目录中,复制大约需要30秒,那么在将第一个字节写入文件夹并尝试移动另一个进程正在使用的文件时,就会调用此方法,因此失败

有什么想法吗


谢谢

在这种情况下,我希望复制过程使用临时文件名将文件移到监视者无法识别的位置


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

您可能需要结合两种解决方案来实现此功能

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

  • 捕获错误并稍后重试


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

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

    我已完成以下操作:

    while(true){
      try
      {
         using (Stream stream = new FileStream("MyFilename.txt"))
         {
            break;
         }
      } catch {
         Thread.Sleep(1000);
      }
    }
    
    它似乎能完成任务