GetDiskFreeSpaceEx函数的问题。

shelluser_2010 2009-03-18 05:43:27
请问如何将GetDiskFreeSpaceEx函数中返回的64位无整型数转化为小数输出。 例如我现在C盘的总容量为9.75G,但是调用该函数是以字节为单位返回的,这是一个很大的数,我将这个数除以1073741824(1024的3次方)得到的是9,可是我想得到的是9.75,我在MSDN中找到了一个__atoi64的函数,好像也不行。请问有没有64位的float型,如果有它和64位无整型函数应如何转换。以下是我的代码,最后得到的是一个整数。

//定义变量
ULARGE_INTEGER nTotalBytes;
ULARGE_INTEGER nFreeBytes;
ULARGE_INTEGER nFreeByteOfTotal;

//调用函数以获得硬盘C分区的信息,为方便我没的使用判断函数调用是否成功。
::GetDiskFreeSpaceEx(_T("C:"),&nFreeBytes,&nTotalBytes,&nFreeByteOfTotal);

//定义变量用于接收C分区总大小,以字节为单位
__int64 i64TotalBytes = nTotalBytes.QuadPart;

//将字节转换为GB
i64TotalBytes = i64TotalBytes / 1073741824;

//转成字符串形式以便显示输出
char chT[10];
sprintf(chT,"你的C盘大小为:%I64u GB",i64TotalBytes);

//显示结果
MessageBox(chT);

...全文
492 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
hpf1908100 2010-06-29
  • 打赏
  • 举报
回复
顶,非常有用
shelluser_2010 2009-03-19
  • 打赏
  • 举报
回复
谢谢各位的方位: 我按照hxzmm的方法,问题已解决了,答者有分。 其他朋友的方法我会逐一调试的,再次感谢!
lcyw 2009-03-19
  • 打赏
  • 举报
回复
/** 计算某个磁盘剩余空间*/
void CPublicData::FreeDiskSpace(char drive)
{
_ULARGE_INTEGER lpTotalFreeBytes;
_ULARGE_INTEGER lpTotalNumberOfBytes;
_ULARGE_INTEGER lpTotalNumberOfFreeBytes;
TCHAR szRoot[4];
sprintf(szRoot,"%c:\\",drive);
GetDiskFreeSpaceEx(szRoot,
&lpTotalFreeBytes,
&lpTotalNumberOfBytes,
&lpTotalNumberOfFreeBytes
);

m_totalFreeSpace = lpTotalNumberOfFreeBytes.QuadPart / (1024 *1024);
}
shelluser_2010 2009-03-19
  • 打赏
  • 举报
回复
谢谢,这种方法有效!
shelluser_2010 2009-03-19
  • 打赏
  • 举报
回复
用float我试过,这个好像不行,好像是32位,怎么可以接收64位的整数呢,我试过的,接数以数不是原数,而是被截去了一部分。
cnzdgs 2009-03-18
  • 打赏
  • 举报
回复
这样试试:
double gb = (double)nTotalBytes.QuadPart / 0x40000000;
char chT[20];
sprintf(chT, "你的C盘大小为:%.2Lf GB", gb);
hxzmm 2009-03-18
  • 打赏
  • 举报
回复
更改上面说的,double可以直接表示__int64的,没必要那么麻烦
直接double a = (double)i64TotalBytes就行了!
Chivalry 2009-03-18
  • 打赏
  • 举报
回复
//将字节转换为GB
float GB;
GB = i64TotalBytes / 1073741824.0;

//转成字符串形式以便显示输出
char chT[100];
sprintf(chT,"你的C盘大小为:%.1f GB",GB);

//显示结果
MessageBox(chT);
hxzmm 2009-03-18
  • 打赏
  • 举报
回复
有一个折衷的方法
__int64 a = i64TotalBytes / 1073741824;
double b = (double)i64TotalBytes - a * 1073741824;
double c = a + b / 1073741824;
char chT[10];
sprintf(chT,"你的C盘大小为:%02f GB",c);

当然还有一个更简单的方法,使用一个API就行了StrFormatByteSize64
用法你去查一下MSDN就知道了!
jieleiping 2009-03-18
  • 打赏
  • 举报
回复
//定义变量用于接收C分区总大小,以字节为单位
float i64TotalBytes = nTotalBytes.QuadPart;

//将字节转换为GB
i64TotalBytes = i64TotalBytes / 1073741824;

//转成字符串形式以便显示输出
char chT[10];
sprintf(chT,"你的C盘大小为:%f GB",i64TotalBytes);

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧