c# - 写入文件后立即读取文件我得到全零(.net)

标签 c# .net file-io file-locking

我有一个程序需要在写入文件后立即从目录加载文件。我让 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 分之一,程序读取全零。文件长度正确,但内容似乎全为零字节。当我稍后检查文件时,我发现它确实包含实际正确的数据。我认为我打开文件的方式可以防止过早访问文件。

我正在通过使用 DOS 命令“copy InFile_0* dropdir”(每次执行大约 100 个文件)将文件复制到目录来测试这个。可能这个命令分两步进行复制:1)分配空间和 2)填充空格和我的程序偶尔会跳到两者中间。

关于如何将其编码为可靠的任何想法?

更新:我无法控制写作程序 - 它可以是任何东西。看来我必须防御性地编写代码。

最佳答案

您遇到了竞争条件。除非您明确修复它,否则它只会从这里变得更糟(使用网络文件系统等)。

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

或者,在目录中保留一个名为“sentinel”或类似名称的零长度文件。让编写文件的程序在每次成功写入另一个文件后重写哨兵文件。然后,不要尝试读取修改日期/时间 >= 标记文件的修改日期/时间的文件。

或者,如果您无法控制文件的编写者,请根据当前系统日期/时间检查每个文件的修改日期/时间。在尝试读取文件之前,让文件老化适当的时间(如果文件小则几秒钟,如果文件大则时间更长)。

祝你好运。这是众所周知的颈部疼痛。

关于c# - 写入文件后立即读取文件我得到全零(.net),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4742158/

相关文章:

c# - 如何在运行时更改 EasingDoubleKeyFrame 值?

java - 在 Java 中使用 PrintWriter 创建文件并写入该文件

c# - 如何创建 2 个相关的下拉列表

.net - ListenUriMode.Unique如何为客户工作?

c# - EntityFramework LINQ 字符串顺序比较

c# - 有没有办法在派生类中使用同名但类型不同的属性?

java - 检查要写入文本文件的字符串/行是否已存在于文本文件中

java - 从 HDFS 下载大文件

c# - 使用 ninject.extensions.factory - 根类中会发生什么?

c# - 如何为在 Visual Studio 2012 中创建的 Windows 服务创建 EXE 安装文件