gpt4 book ai didi

c++ - statvfs 问题 - printf/调试器

转载 作者:太空狗 更新时间:2023-10-29 21:29:31 26 4
gpt4 key购买 nike

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

这应该给我 total=437006,但我的输出坚持认为 total=2830。很明显,我在格式化或数学方面做了一些无知的事情。

如果我添加一行:

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

x 的计算结果为 2967912448,而调试器向我显示了适当的值(见上文)。

系统:Linux版本2.6.18-194.17.1.el5PAE
i386

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

最佳答案

fsblkcnt_t 的大小是多少?如果是 32 位,那就是溢出问题,您只需在计算期间临时使用 64 位大小即可。

关于c++ - statvfs 问题 - printf/调试器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4659939/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com