【问题标题】:detecting that a file is currently being written to检测到当前正在写入文件
【发布时间】:2014-04-18 15:52:46
【问题描述】:

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

我需要编写一个 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
      {
        //???
      }
    }
  }

【问题讨论】:

  • 我已经阅读了那篇文章,我的问题是等待部分没有解释。
  • 您不会知道文件将保持锁定多长时间。据你所知,它可能永远保持锁定状态。您所能做的就是定期重试。您重试的频率取决于您的判断。
  • 如何每 60 秒轮询一次目录并尝试移动早于 60 秒(最后写入)的文件。如果移动不起作用,请忽略它,因为它将在下一个轮询间隔再次尝试。
  • 文件可能有不同的大小。有些可能需要超过 60 秒才能完成,有些可能需要不到 1 秒。我不想浪费时间。

标签: c# file-io file-locking


【解决方案1】:

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

具体来说,您可以挂钩OnChanged 事件,在它引发后您可以检查IsFileLocked 以验证它是否仍在写入。

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

【讨论】:

    猜你喜欢
    • 2011-08-15
    • 1970-01-01
    • 1970-01-01
    • 2015-01-15
    • 2013-03-29
    • 2016-01-30
    • 2011-05-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多