Wesley Ranger Wesley Ranger - 1 month ago 12
C++ Question

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

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?

Answer

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.