我尝试使用statvfs在文件系统上查找可用空间。
以下是代码:
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
我已经阅读了这里引用此功能的其他条目,它们使它看起来非常简单。那么我哪里误入歧途?
答案 0 :(得分:3)
fsblkcnt_t的大小是多少?如果它是32位则会出现溢出问题,您只需在计算过程中暂时使用64位大小。