Disk gets full during file write. How can I get notified about this?

落花浮王杯 提交于 2019-12-10 23:49:23

问题


I have a quite big object to serialize to disk, like this:

if (!EngineFile.empty())
{
    std::ofstream OutEngineStream(EngineFile);
    if (!OutEngineStream)
    {
        std::cerr << "Failed to write to file \"" << EngineFile << "\"! Aborting ..." << std::endl;
        return -1;
    }
    engine->serialize(OutEngineStream);
    OutEngineStream.close();

    std::cout << "\"" << EngineFile << "\" successfully wrote to disk." << std::endl;
}

The problem is, somtimes serialize requires larger disk space than available. e.g. there is only 30M storage available but serialize requires 200M. In this case I can normally open the stream. During serialize everything goes well, and close returns nothing. The program runs well, but there is only a 30M file on the disk.

How can I get to know about this case?


回答1:


First of all, serialize should constantly verify whether its write operations succeed and throw should they fail.

In the code you've presented you should check OutEngineStream.fail() (it covers more cases than bad) before calling close (because close may also set this state). This however will still leave serialize implemented incorrectly.




回答2:


The presented code checks for failure of opening the file.

In addition it should for failure of the write operation.

That's how to detect if the write operation failed.




回答3:


What about this:

std::fstream file;
file.exceptions( std::fstream::failbit | std::fstream::badbit );
try {
    // do work
}
catch (std::fstream::failure e) {
    std::cerr << "Exception opening/reading/writing/closing file\n";
}


来源:https://stackoverflow.com/questions/40056884/disk-gets-full-during-file-write-how-can-i-get-notified-about-this

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!