我有一个程序需要在写入文件后立即从目录中加载文件。我让 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();
}
问题是对于某些文件,大约 200 个文件中的 1 个,程序读取全零。文件长度正确,但内容似乎全为零字节。当我稍后检查文件时,我发现它确实包含实际正确的数据。我认为我打开文件的方式可以防止过早访问该文件。
我正在通过使用 DOS 命令“copy InFile_0* dropdir”将文件复制到目录来测试这一点(每次执行大约 100 个文件。)这个命令可能分两个步骤进行复制:1)分配空间和 2)填充空间和我的程序偶尔会在两者中间跳转。
关于如何将其编码为可靠的任何想法?
更新: 我无法控制写作程序——它可以是任何东西。看来我必须进行防御性编码。