【问题标题】:Qt file resize behaves weirdly in LinuxQt 文件调整大小在 Linux 中的行为很奇怪
【发布时间】:2014-10-25 00:20:29
【问题描述】:

这是我的代码 sn-p

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

【问题讨论】:

    标签: c++ linux windows qt file


    【解决方案1】:

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

    这里发生的情况是,您正在分配一个 sparse file - 一个由 NUL 字节填充的文件,您的文件系统将其分配优化为一个简单的“跟踪文件的广告大小”。

    附带说明:您不应该使用这样的 64 位整数文字,而是将它们包装到 Q_INT64_C 中。

    【讨论】:

      猜你喜欢
      • 2012-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多