我维护一个程序,负责从数据采集系统收集数据并将该数据附加到非常大(大小> 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()被调用的文件和所发生的故障win32错误是b由GetLastError()返回的eing为665(ERROR_FILE_SYSTEM_LIMITATION)。搜索谷歌这个错误会导致一堆与SQL服务器文件的“范围”有关的报告。我怀疑文件系统正在报告某种日志记录资源,这是因为我们正在通过打开它来增加一个大文件,附加一大块数据并关闭它。我现在正在寻求理解这个特定的错误,希望能提出有效的补救措施。
回答你说“数据似乎已写入文件”。该文件是否按预期进行了修改,然后 - 虽然大小/修改日期没有反映这一点? – 2011-06-04 13:41:44
不,我的意思仅仅是来自fwrite()的返回值表示数据已成功写入。 – 2011-06-06 12:58:58