当磁盘几乎已满时,在使用C ++ streambuffer的Linux中复制文件时也不例外?

时间:2016-12-14 12:52:58

标签: c++ linux filesystems fstream ofstream

我正在尝试处理这种情况,当可用磁盘空间小于我要复制的文件时,但是从我测试过的内容看来我没有异常并且文件被截断为免费该磁盘上留有空间。

例如,我保存在另一个磁盘上的源有3MB,目标磁盘只有2MB空闲,然后文件写入将被截断为2MB并且不会抛出任何异常。

我的示例代码如下:

#include <iostream>
#include <fstream>

using namespace std;

int main() {


ifstream source("/some/other/disk/source.file", ios::binary);
ofstream dest("/my/almost/full/disk/dest.file", ios::binary);
dest.exceptions(std::ifstream::failbit | std::ifstream::badbit );

try {

dest << source.rdbuf();

} catch (std::exception &ex) { /* not reached */

cout << "It's dead, Jim: " << ex.what() << endl;

}


source.close();
dest.close();

return 0;
}

只有当磁盘已满并预先填充时,代码才会按预期行事(抛出异常)。

谢谢!

1 个答案:

答案 0 :(得分:1)

在输出流上完成复制后,检查eof。它不应该在eof。如果复制了文件,则会设置。

ofstream的成员函数eof应该有所帮助。 请参阅this

编辑1:我可以考虑在stat文件和来源上执行dest的另一种方式,如果不匹配,则不会完全复制。另一种方法是在dest上执行搜索并在不调用stat的情况下计算文件大小,然后比较大小。问题是stat不适用于所有操作系统,因此寻求应该这样做。

#include <fstream>

std::ifstream::pos_type filesize(const char* filename)
{
    std::ifstream in(filename, std::ifstream::ate | std::ifstream::binary);
    return in.tellg(); 
}

此代码可以找到filesize。