c++ - Qt 文件调整大小在 Linux 中表现怪异

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

最佳答案

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

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

附带说明:您不应使用此类 64 位整数文字,而应将它们包装到 Q_INT64_C 中。

关于c++ - Qt 文件调整大小在 Linux 中表现怪异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25594514/

相关文章:

c++ - 在 C++ 中使用 Eigen/Sparse 库,有没有办法从稀疏矩阵中删除列?

c++ - stm32f4-eval2板的keil中的printf

c++ - 从两个 8 位字符创建并填充 10 位集

linux - Linux Power PC试图在启动时挂载MTD分区

c# - 从 .Net 的角度看 Windows 服务的体系结构

c++ - 如何连接 "on the fly"一个文本+整数并将其传递给函数?

python - 相同的 xpath 在 Centos、Ubuntu 上返回不同的值

linux - 位置参数上 ls 命令的退出状态

c# - 在可 ScrollView 中渲染 2D 图元

windows - Gnu emacs 窗口标题默认