【问题标题】:What can lead to failures in appending data to a file?什么会导致将数据附加到文件失败?
【发布时间】:2011-06-04 13:29:38
【问题描述】:

我维护了一个程序,该程序负责从数据采集系统收集数据并将该数据附加到一个非常大(大小 > 4GB)的二进制文件中。在附加数据之前,程序必须验证这个文件的头部,以确保文件中的元数据与已收集的元数据相匹配。为此,我按如下方式打开文件:

data_file = fopen(file_name, "rb+");

然后我寻找文件的开头以验证标题。完成后,我按如下方式查找文件末尾:

_fseeki64(data_file, _filelengthi64(data_file), SEEK_SET);

此时,我将使用 fwrite() 收集到的数据写入。我仔细检查了所有 I/O 函数的返回值。

我们一直在测试此程序的其中一台计算机(Windows 7 64 位)间歇性地显示数据似乎已写入文件但文件的最后更改时间和大小均未更改的情况。如果对 fopen()、fseek() 或 fwrite() 的任何调用失败,我的程序将抛出异​​常,这将导致数据收集过程中止并记录错误。在这台机器上,这些故障似乎都没有发生。让事情变得更加神秘的是,如果在主机文件系统上设置了还原点,问题就会消失,只是在未来某个时间间歇性地再次出现。

我们曾尝试在其他机器(vista 32 位操作系统)上重现此问题,但未能成功重现此问题(这并不一定意味着什么,因为问题一开始就非常间歇性。

有没有人遇到过类似的情况?有没有潜在的补救措施?

更多信息

我现在发现在文件上调用 fflush() 时会发生故障,并且 GetLastError() 返回的 win32 错误是 665 (ERROR_FILE_SYSTEM_LIMITATION)。在 google 上搜索此错误会导致一堆与 SQL 服务器文件的“范围”相关的报告。我怀疑文件系统正在报告某种日志资源,这是因为我们正在通过打开一个大文件、附加一大块数据并关闭它来增长它。我现在正在寻求有关此特定错误的理解,并希望提出有效的补救措施。

【问题讨论】:

  • 您说“数据似乎已写入文件”。文件是否按预期修改,然后 - 尽管大小/修改日期没有反映这一点?
  • 不,我的意思只是 fwrite() 的返回值表明数据已成功写入。

标签: visual-studio-2010 windows-7 file-io


【解决方案1】:

由于文件系统碎片限制,文件追加失败。问题已在What factors can lead to Win32 error 665 (file system limitation)?

中得到解答

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-30
    • 1970-01-01
    • 2013-11-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多