【发布时间】: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