关于GetDiskFreeSpace的问题

huang_2 2001-11-30 11:08:16
(1)在GetDiskFreeSpace里,怎样指定我要的路径,假设我要指定D驱.
(2)help里面说如果路径省略,就是指程序所在的驱动盘,但按照结果来看,也就是
Total*Sector*Byte/1024=65526*9561*512/1024=313247043 和我的C:3,4GB的容量不符,为什么?


void __fastcall TForm1::Button1Click(TObject *Sender)
{
DWORD Sector,Byte,Free,Total;
if(GetDiskFreeSpace(NULL,§or,&Byte,&Free,&Total))
{

Edit1->Text=IntToStr(Sector);
Edit2->Text=IntToStr(Byte);
Edit3->Text=IntToStr(Free);
Edit4->Text=IntToStr(Total);
}

}
...全文
429 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
gloom 2001-11-30
  • 打赏
  • 举报
回复
给分吧,呵呵
gloom 2001-11-30
  • 打赏
  • 举报
回复
找到一个完整的示例:两种方式都可以

void __fastcall TForm1::ComboBox1Change(TObject *Sender)
{
DWORD sec1, byt1, cl1, cl2;
ULARGE_INTEGER FreeBytes, TotalBytes;

// 获取卷号信息
Edit1->Text = IntToStr(
GetDiskVolSerialID(ComboBox1->Items->Strings[ComboBox1->ItemIndex]));

// 获取容量信息
GetDiskFreeSpace(
ComboBox1->Items->Strings[ComboBox1->ItemIndex].c_str(), // 目录名
&sec1, // 每簇的扇区数
&byt1, // 每扇区的字节数
&cl1, // 空闲簇数
&cl2); // 总簇数
// cl1 = cl1*sec1*byt1;
// cl2 = cl2*sec1*byt1;
// Edit2->Text = FormatFloat("###,##0", cl2);
// Edit3->Text = FormatFloat("###,##0", cl1);

::GetDiskFreeSpaceEx(
ComboBox1->Items->Strings[ComboBox1->ItemIndex].c_str(), // 目录名
// 如果为NULL,则返回当前目录的大小
&FreeBytes, // 可用磁盘空间
&TotalBytes, // 总磁盘空间
NULL); // 可用磁盘空间(可为NULL)

char buff[32];
unsigned __int64 uI64 = FreeBytes.HighPart*pow(2,32) + FreeBytes.LowPart;
_i64toa(uI64, buff, 10);
Edit2->Text = buff;
uI64 = TotalBytes.HighPart*pow(2,32) + TotalBytes.LowPart;
_i64toa(uI64, buff, 10);
Edit3->Text = buff;
}
kingfish 2001-11-30
  • 打赏
  • 举报
回复
计算错误!
huang_2 2001-11-30
  • 打赏
  • 举报
回复
To:gloom(《一丈丝纶一寸钩,一人独占一江秋》) 
Total每次都是65526,我也是这样,你会不会用GetDiskFreeSpaceEx,如果用他应怎么改动代码,可能用这个新的函数可以算出正确的磁盘容量
gloom 2001-11-30
  • 打赏
  • 举报
回复
是获得char*指针的。看看HELP吧
huang_2 2001-11-30
  • 打赏
  • 举报
回复
c_str()是干什么的,转换?
gloom 2001-11-30
  • 打赏
  • 举报
回复
指定盘符最好带上"\\",如果从其它类型变量获得注意转换为char *
如AnsiString disk="d:\\";
if(GetDiskFreeSpace(disk.c_str(),§or,&Byte,&Free,&Total))
{
//...
}

gloom 2001-11-30
  • 打赏
  • 举报
回复
指定盘符最好带上"\\",如果从其它类型变量获得注意转换为char *
如AnsiString disk="d:\\";
if(GetDiskFreeSpace(disk.c_str(),§or,&Byte,&Free,&Total))
{
//...
}

huang_2 2001-11-30
  • 打赏
  • 举报
回复
char Path[20];
Path=ComboBox1->Text;
如果我这样动态指定路径,BCB会报错 (can't convert ansistring to char),动态指定路径的正确代码应是怎样?

gloom 2001-11-30
  • 打赏
  • 举报
回复
为什么我得到Total每次都是65526?我试了几个盘,容量从3GB到15GB,其它倒没问题,
ggyy 2001-11-30
  • 打赏
  • 举报
回复
要么是:
"c:"
要么是:
"c:\"或者"c:\\"

13,873

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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