2014-08-31 90 views
1

这里是我的代码片段Qt的调整文件大小在Linux的古怪行为

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上一样。

编辑:那么按照佩普的答案这里是工作代码:

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

回答

3

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

这里发生的事情是,你正在分配一个sparse file--一个由NUL字节组成的文件,它的分配被文件系统优化成一个简单的“跟踪文件广告大小”。

作为一个方面说明:你不应该使用这样的64位整数文字,而是将它们换成Q_INT64_C

+0

感谢工作像一个魅力 – 2014-09-02 14:11:54