2011-01-11 33 views
3

我試圖使用statvfs來查找文件系統上的可用空間。statvfs問題 - printf/debugger

下面的代碼:

const char* Connection::getDiskInfo() 
{ 
struct statvfs vfs; 
int nRet = statvfs("/u0", &vfs); 
if(nRet) return NULL; 

char* pOut = (char*)malloc(256); 
memset(pOut, 0, 256); 

sprintf(pOut, "<disk letter='%s' total='%lu' free='%lu' totalfree='%lu'/>", 
    "/", (vfs.f_bsize * vfs.f_blocks)/(1024 * 1024), 
    (vfs.f_bsize * vfs.f_bavail)/(1024 * 1024), 
    (vfs.f_bsize * vfs.f_bfree )/(1024 * 1024)); 

return pOut; 
} 

在調試器(NetBeans 6.9中)我看到的statvfs結構的相應值:

f_bavail = 105811542 
f_bfree = 111586082 
f_blocks = 111873644 
f_bsize = 4096 

這應該給我總= 437006但我的輸出堅持總數= 2830。很顯然,我在格式或數學方面做了一些無知的事情。

如果我行補充:

unsigned long x = (vfs.f_bsize * vfs.f_blocks); 

X計算爲2967912448當調試器顯示我適當的值(見上文)。

系統:Linux版本的2.6.18-194.17.1.el5PAE
I386

我讀過這裏的其他項指的是這個功能,他們使它看起來非常簡單。那麼我在哪裏誤入歧途?

回答

3

fsblkcnt_t的大小是多少?如果它是32位的,那麼這是一個溢出問題,您只需在計算過程中臨時使用64位大小。

+0

就是這樣。我不得不將所有的sprintf中的變量都轉換爲unsigned long long int。 – ethrbunny 2011-01-11 18:12:37