2012-01-14 143 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