Qt文件调整大小在Linux中表现得很奇怪

时间:2014-08-31 17:32:49

标签: c++ linux windows qt file

这是我的代码段

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();

1 个答案:

答案 0 :(得分:3)

对该QFile对象包装的文件描述符使用fallocate(2),以使内核实际分配磁盘空间。

这里发生的是你正在分配sparse file - 一个充满NUL字节的文件,其文件系统将其分配优化为一个简单的&#34;保持跟踪广告的大小&#34;。

作为旁注:你不应该使用这样的64位整数文字,而是将它们包装成Q_INT64_C