在编写大型二进制文件时,ofstream :: write在写入中途失败
在运行时,我的程序会同时创建两个大的二进制文件并将其写入磁盘。文件A约为240GB,文件B约为480GB。这两个文件由两个ofstream
对象维护,写入操作在循环中使用成员函数write
执行。在编写大型二进制文件时,ofstream :: write在写入中途失败
现在的问题是:每次整个写文件过程达到63〜64%时写文件操作都会失败。第一次在文件A上失败,第二次在文件B上失败。
在程序运行期间,我的建筑物的电源正在升级。奇怪的是,每次程序失败时,电工恰好正在切断和恢复中央空调和一些办公室的电源。因此,我真的怀疑写入文件失败是否是由不稳定的电源造成的。
我确定失败不是由文件大小限制造成的,因为我试图用同样的方法编写一个单一的700GB文件而没有任何问题。
有没有办法找出详细的原因?我觉得ofstream
的标志(badbit
,eofbit
和failbit
)不提供太多的信息。现在我试图使用errno
和strerror
来获取详细的错误消息。然而,我看到errno
的可能值是EIO
,它测量了“I/O错误”,它再次没有提供有用的信息。
有没有人遇到过这种情况?
顺便说一句,当文件A和文件B的大小很小时,程序运行没有错误。
PS:这次程序在55%失败,并且errno值是EINVAL:无效参数。很奇怪。
确认,原因确实是NTFS的一个错误:A heavily fragmented file in an NTFS volume may not grow beyond a certain size。这意味着CreateFile和WriteFile也无法从根本上解决问题。
好的,我已经解决了Win32 API的问题:CreateFile和WriteFile。
你有没有试过只写63〜64%的文件子集? – moooeeeep 2012-04-25 11:49:59
@moooeeeep:但现在刚发生的是,它只是写出两个文件的63〜64%的子集。我可以看到63%〜64%的子集成功写入,因为我看到在程序转换时两个文件越来越大。 – 2012-04-25 11:58:27
也许是S.M.A.R.T.实用程序可以给出一些线索。 – 2012-04-25 14:14:06