这是我的代码段
QFile temfile(fileUrl);
if(temfile.open(QIODevice::WriteOnly) == false)
{
qDebug()<<"Unable to create file!";
return;
}
if(temfile.resize(5073741824) == false) // 5GB
{
qDebug()<<"Insufficient disk space!";
return;
}
temfile.close();
现在在Windows上,如果NTFS文件系统的磁盘空间少于5GB,则会显示
Insufficient disk space!
但是在Linux(Ubuntu 12.10)上,即使空间较小,文件也会调整大小。在右键单击属性文件大小甚至显示为5GB但不以某种方式计算。由于以上代码检查失败,我可以创建任意数量的5GB文件。
当我开始写入文件(假设为200MB)时,大小只占200MB但显示为5GB。
这有什么解决方案吗?我希望它的行为与Windows上的行为相同。
编辑:所以根据peppe的回答,这里是工作代码:
QFile temfile(fileUrl);
if(temfile.open(QIODevice::WriteOnly) == false)
{
qDebug()<<"Unable to create file!";
return;
}
#ifdef Q_OS_LINUX
if(fallocate(temfile.handle(), 0, 0, 5073741824) < 0)
{
qDebug()<<"Insufficient disk space!";
return;
}
#else
if(temfile.resize(5073741824) == false)
{
qDebug()<<"Insufficient disk space!";
return;
}
#endif
temfile.close();
答案 0 :(得分:3)
对该QFile对象包装的文件描述符使用fallocate(2)
,以使内核实际分配磁盘空间。
这里发生的是你正在分配sparse file - 一个充满NUL字节的文件,其文件系统将其分配优化为一个简单的&#34;保持跟踪广告的大小&#34;。
作为旁注:你不应该使用这样的64位整数文字,而是将它们包装成Q_INT64_C
。