【问题标题】:Moving files from watched folder in C#从 C# 中的监视文件夹中移动文件
【发布时间】:2010-10-24 01:50:21
【问题描述】:

我正在使用 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 秒,当第一个字节写入文件夹并尝试移动一个正在被复制的文件时,就会调用这个方法被另一个进程使用所以失败。

有什么想法吗?

谢谢

【问题讨论】:

    标签: c# move filesystemwatcher


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

          我已经这样做了:

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

          它似乎完成了这项工作

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2019-03-09
            • 2021-08-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-10-05
            相关资源
            最近更新 更多