2014-08-31 23 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