【发布时间】:2011-01-20 00:00:19
【问题描述】:
我有一个程序需要在文件写入后立即从目录加载文件。我让 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)填充空间和我的程序偶尔会在两者中间跳转。
关于如何将其编码为可靠的任何想法?
更新:我无法控制写作程序 - 它可以是任何东西。看来我必须防御性地编写代码。
【问题讨论】:
-
提示:为您的异常添加日志记录。不要默默地失败。
-
您正在使用的程序不会对文件进行任何锁定。例如,对于 C 程序很常见,fopen() 允许任何程序在打开文件时进行读写。除了“等待一段时间”之外,没有很多方法可以获胜。
标签: c# .net file-io file-locking