statvfs问题 - printf / debugger

时间:2011-01-11 16:28:57

标签: c++ linux printf

我尝试使用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

我已经阅读了这里引用此功能的其他条目,它们使它看起来非常简单。那么我哪里误入歧途?

1 个答案:

答案 0 :(得分:3)

fsblkcnt_t的大小是多少?如果它是32位则会出现溢出问题,您只需在计算过程中暂时使用64位大小。