2012-01-14 120 views
1

我目前正在嘗試在字節中使用statfs()字節來獲取磁盤空間。 我做了一個小功能,但我得到了非常奇怪的值。 (我工作Ubuntu的32位系統上)statfs返回奇怪的值

下面是代碼:

bool 
CheckDiskSpace(const CLString &devPath, ulonglong &diskSize, ulonglong &totalFreeBytes) 
{ 
bool retVal = false; 
struct statfs fs; 
if((statfs(devPath.c_str(), &fs)) < 0) { 
    printf("Failed to stat %s: %s\n", devPath.c_str() ,strerror(errno)); 
    return false; 
} else { 
    diskSize = fs.f_blocks * fs.f_bsize; 
    totalFreeBytes = fs.f_bfree * fs.f_bsize; 
    retVal = true; 
} 
return retVal; 
} 

int main() 
{ 
    ulonglong diskSize, totalFreeBytes; 
    CheckDiskSpace("/dev/sda5", diskSize, totalFreeBytes); 
    printf("Disk size: %llu Byte\n", diskSize); 
    printf("Free size: %llu Byte\n", totalFreeBytes); 
} 

我也得到:

Disk size: 1798447104 Byte 
Free size: 1798443008 Byte 

我真的不明白這一點的結果,因爲與「DF 「我得到的命令:

Filesystem   1K-blocks  Used Available Use% Mounted on 
/dev/sda5   111148848 47454952 58047832 45%/
udev     1756296   4 1756292 1% /dev 
tmpfs     705324  912 704412 1% /run 
none      5120   0  5120 0% /run/lock 
none     1763300  1460 1761840 1% /run/shm 

任何幫助都非常贊同!

PS:我有一個120 GB的SSD,我的分區是在Ext4。

編輯:ULONGLONG是predifined類型:

typedef unsigned long long ulonglong; 
+0

你是對的改變。完成! – Athanase 2012-01-14 21:43:31

+0

如果你甚至沒有檢查它們,你爲什麼返回真/假? – fazo 2012-01-14 21:57:18

+1

根據'statfs(2)','f_bsize'成員是「最優傳輸塊大小」。是什麼讓你認爲這是文件系統的數據塊大小,因爲它與'f_blocks'成員有關? – Borealid 2012-01-14 21:58:51

回答

2

你得到了安裝在/dev的tmpfs的作爲/dev/sda5是對文件系統的結果。如果您想知道您的根文件系統,只需使用/或任何不在/dev/run中的路徑。

+0

這正是我的想法,我已經嘗試過了,但結果與上一個一樣奇怪:磁盤大小:2147270656字節 自由大小:795549696字節。我認爲這是錯誤的,因爲它給了我1.99980163574219吉字節的磁盤空間。 – Athanase 2012-01-14 22:15:34

+0

你是什麼奇怪的?如果它不是完全相同的值,那可能是因爲你正在計數字節,並且df以1KB塊的形式打印它。嘗試除以1024. – 2012-01-14 22:17:07

+0

您在此期間是否對您的代碼進行過任何其他修改?因爲你的問題的結果是由'df'打印的完全相同的值(對於我已經說過的'/ dev'),除以1024 ......我不認爲這是巧合。 – 2012-01-14 22:22:04

0

我想你想要的是:

CheckDiskSpace("/dev/sda5", &diskSize, &totalFreeBytes); 

因爲diskSize和totalFreeBytes沒有在CheckDiskSpace與您的代碼

+0

我知道,那是因爲它只是我的代碼的一部分。在完整的代碼中,它們被改變了。 – Athanase 2012-01-14 22:08:34

+0

@fazo它們是作爲參考傳遞的,它是C++。 – 2012-01-14 22:12:34