文件写入期间磁盘变满。我怎样才能得到这方面的通知?

Disk gets full during file write. How can I get notified about 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;
}

问题是,有时 serialize 需要比可用空间更大的磁盘 space。例如只有 30M 可用存储空间,但 serialize 需要 200M。在这种情况下,我通常可以 open 流。 serialize 期间一切顺利,close returns 期间一事无成。程序运行良好,但磁盘上只有一个30M的文件

我怎样才能知道这个案子?

提供的代码检查打开文件是否失败。

另外应该是写操作失败。

这就是检测写入操作是否失败的方法。

这个怎么样:

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";
}

首先,serialize应该不断验证其写操作是否成功,如果失败则抛出。

在您提供的代码中,您应该在调用 close 之前检查 OutEngineStream.fail()(它涵盖的情况比 bad 多)(因为 close 也可能设置此状态)。但是,这仍然会使 serialize 实施不正确。