检测到当前正在写入文件

时间:2014-04-18 15:52:46

标签: c# file-io file-locking

(我知道这是一个常见的问题,但我无法找到确切的答案)

我需要编写一个监视目录的Windows服务,并在文件到达时打开它,解析文本,对其执行某些操作并随后将其移动到另一个目录。我使用this post中提到的IsFileLocked方法来查明文件是否仍然被写入。我的问题是,我不知道另一方完成写入文件需要多少钱。我可以在打开文件之前等几秒钟,但这不是一个完美的解决方案,因为我不知道写入文件的速率和几秒钟可能是不够的。

这是我的代码:

while (true)
  {
    var d = new DirectoryInfo(path);
    var files = d.GetFiles("*.txt").OrderBy(f => f);

    foreach (var file in files)
    {
      if (!IsFileLocked(file))
      {
        //process file
      }
      else
      {
        //???
      }
    }
  }

1 个答案:

答案 0 :(得分:1)

我认为您可以使用FileSystemWatcher(有关此内容的更多信息:http://msdn.microsoft.com/it-it/library/system.io.filesystemwatcher(v=vs.110).aspx)。

具体而言,您可以挂钩OnChanged事件,在提出之后,您可以检查IsFileLocked以验证它是否仍然被写入。

此策略应避免您主动等待轮询。