文件写入期间磁盘已满。我怎样才能得到通知?

时间:2016-10-15 08:36:34

标签: c++ fstream

我有一个非常大的对象要序列化到磁盘,如下所示:

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

问题是,somtimes serialize需要比可用磁盘空间更大的磁盘空间。例如只有30M存储空间可用,但serialize需要200M存储空间。在这种情况下,我通常可以open流。 serialize期间一切顺利,close不返回任何内容。该程序运行良好,但磁盘上只有一个30M的文件。

我怎样才能了解这个案子?

3 个答案:

答案 0 :(得分:1)

显示的代码检查打开文件失败。

此外,它应该是写操作失败。

如何检测写操作是否失败。

答案 1 :(得分:1)

这个怎么样:

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

答案 2 :(得分:1)

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

在您提供的代码中,您应该在致电bad之前检查OutEngineStream.fail()(它涵盖的案件多于close)(因为close也可能设置此项州)。但是,这仍然会导致serialize执行不正确。