我有一个程序,需要在编写目录后立即加载文件。我得到了FileSystemWatcher,以通知我目录的更改。而不是检查事件是否有什么变化,我只是列出文件并开始处理我发现的所有内容。

为了防止尝试读取仍在编写的文件,我有类似的代码:

try {
    fs = fi.Open(FileMode.Open, FileAccess.ReadWrite,
                    FileShare.None);
    message = new byte[fs.Length];
    int br = fs.Read(message, 0, (int)fi.Length);
}
catch (Exception e) {
    // I'll get it next time around
    return;
}
finally {
    if (fs != null)
        fs.Close();
}

问题在于,对于某些文件,该程序读取所有零。文件长度是正确的,但内容似乎全部为零字节。当我检查文件后,我发现它确实包含实际正确的数据。我以为我打开文件的方式将阻止对文件过早访问。

我正在通过将文件复制到目录中的DOS命令“复制Infile_0* dropdir'(每个执行约100个文件)来测试此内容。程序偶尔会跳到两者的中间。

关于如何对此编码的任何想法可靠?

更新: 我无法控制写作程序 - 可能是什么。看来我必须防御地编码。

有帮助吗?

解决方案

您正在遇到比赛状况。除非您确定地修复,否则它将仅在此处变得更糟(使用网络文件系统等)。

尝试让程序编写文件使用“ Whate.tmp”名称编写每个文件,然后将其关闭,然后重命名。阅读时,忽略.tmp文件。

或者,在目录中保留一个名为“ Sentinel”之类的零长度文件。在每次成功写出另一个文件后,将程序编写文件编写以重写Sentinel文件。然后,不要尝试读取修改日期/时间为> =前哨文件的修改日期/时间的文件。

或者,如果您无法控制文件的作者,请根据当前系统/时间检查每个文件的修改日期/时间。在尝试阅读它们之前,请让文件年龄适当的量(如果它们很小,如果它们很小,如果它们较大,则更长)。

祝你好运。这是脖子上臭名昭著的疼痛。

其他提示

好吧,我不同意@ollie Jones的先前帖子。

您已经建立了对文件的独家访问,因此没有种族条件问题。

我认为您应该更仔细地检查作者的行为。并尝试减少仅使用读取的文件访问的干扰,共享所有访问:

fi.Open(FileMode.Open, FileAccess.Read, FileShare.ReadWrite);

这可能会使您的阅读失败,但会减少写入错误。要决定何时安全阅读,您可以检查文件时间或文件大小或其他内容。如果随后将写许多文件,您可以在创建第二个文件后开始读取第一个文件。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top