在运行时,我的程序会创建两个大型二进制文件并将其同时写入磁盘。文件A约240GB,文件B约480GB。这两个文件由两个ofstream
对象维护,写操作是通过成员函数write
循环执行的。
现在的问题是:每次写文件过程到63~64%时,写文件操作就失败了。第一次在文件A上失败,第二次在文件B上失败。
这几天程序运行的时候,正好我楼的电源在升级。奇怪的是,每次程序失败时,电工恰好在切断和恢复中央空调和一些办公室的电源。因此,我很怀疑写文件失败是否是电源不稳定造成的。
我确定失败不是由文件大小限制引起的,因为我已经尝试使用相同的方法写入单个 700GB 的文件而没有任何问题。
有什么办法可以查出具体原因吗?我觉得 ofstream
的标志(badbit
、eofbit
和 failbit
)没有提供太多信息。现在我正在尝试使用 errno
和 strerror
来获取详细的错误消息。但是,我看到 errno
的可能值是 EIO
,这意味着“I/O 错误”,它也没有提供任何有用的信息。
有没有人遇到过这种情况?
顺便说一句,当文件A和文件B的尺寸较小时,程序运行没有错误。
PS:这次程序失败55%,errno值为EINVAL: Invalid argument。很奇怪。
最佳答案
确认,原因确实是NTFS的bug:A heavily fragmented file in an NTFS volume may not grow beyond a certain size .这意味着CreateFile和WriteFile也不能从根本上解决问题。
关于c++ - ofstream::write 在写入大型二进制文件时在中间失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10314949/