文件写入期间磁盘变满。我怎样才能得到这方面的通知?
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
实施不正确。
我有一个相当大的对象要序列化到磁盘,如下所示:
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
实施不正确。