如何查詢硬碟大小 |
尚未結案
|
kraen4468
初階會員 發表:66 回覆:112 積分:35 註冊:2003-12-04 發送簡訊給我 |
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { char ch; int driver=1; AnsiString msg,drvroot="A:\\"; unsigned long SecPerCls,BytesPerSec,NumOfFreeCls,TotalNumOfCls; for(driver=1,ch='C';ch<='D';ch ) { if(driver&driver1) { drvroot.c_str()[0]=ch; if(GetDiskFreeSpace(drvroot.c_str(),&SecPerCls,&BytesPerSec, &NumOfFreeCls,&TotalNumOfCls)) { ListBox1->Items->Append(AnsiString(ch) ";\t" "Total " IntToSpace(SecPerCls*BytesPerSec*TotalNumOfCls) "(Free space: " IntToSpace(SecPerCls*BytesPerSec*NumOfFreeCls) " )"); } else ListBox1->Items->Append(AnsiString(ch) ":\tDriver not ready"); } driver<<=1; } AnsiString __fastcall TForm1::IntToSpace(unsigned long DiskSpace) { AnsiString result; if(DiskSpace>>20)result=IntToStr(DiskSpace>>20) "MB"; else if (DiskSpace>>10)result=IntToStr(DiskSpace>>10) "KB"; else result=IntToStr(DiskSpace) "Bytes"; return result;請問我的設定值是不是設錯呢 ~我還在學習狀態希望多多向您學習~ |
GaryKao99
中階會員 發表:46 回覆:102 積分:54 註冊:2002-08-23 發送簡訊給我 |
DiskSize Returns the size, in bytes, of a specified drive. Unit Sysutils Category file management routines extern PACKAGE __int64 __fastcall DiskSize(Byte Drive); Description DiskSize returns the size in bytes of the specified drive, where 0 = Current, 1 = A, 2 = B, etc. DiskSize returns -1 if the drive number is invalid. Example: __int64 AmtFree = DiskFree(0); __int64 Total = DiskSize(0); AnsiString S; S.sprintf("%I64d percent of the space on drive 0 is free: %I64d KB", AmtFree*100/Total, AmtFree/1024 ); Label1->Caption = S;~~~~~~~~~~~~~~~~~~~~~~ 我什麼都會, 就兩樣不會 就是 這個也不會, 那個也不會 |
kraen4468
初階會員 發表:66 回覆:112 積分:35 註冊:2003-12-04 發送簡訊給我 |
|
JerryKuo
版主 發表:42 回覆:571 積分:322 註冊:2003-03-10 發送簡訊給我 |
你好: 我有試過你的程式碼,有點小錯誤,不過改一下就可以執行
執行出來的結果不是很正確,問題是出在這嗎?
void __fastcall TForm1::Button1Click(TObject *Sender) { char ch; int driver=1; AnsiString msg,drvroot="C:\\"; unsigned long SecPerCls,BytesPerSec,NumOfFreeCls,TotalNumOfCls; for(driver=1,ch='C';ch<='E';ch ) { if(driver) { drvroot.c_str()[0]=ch; if(GetDiskFreeSpace(drvroot.c_str(),&SecPerCls,&BytesPerSec, &NumOfFreeCls,&TotalNumOfCls)) { ListBox1->Items->Append(AnsiString(ch) ";\t" "Total " IntToSpace(SecPerCls*BytesPerSec*TotalNumOfCls) "(Free space: " IntToSpace(SecPerCls*BytesPerSec*NumOfFreeCls) " )"); } else ListBox1->Items->Append(AnsiString(ch) ":\tDriver not ready"); } } driver<<=1; } //-------------------------------------------------------------------- AnsiString __fastcall TForm1::IntToSpace(unsigned long DiskSpace) { AnsiString result; if(DiskSpace>>20) result=IntToStr(DiskSpace>>20) "MB"; else if (DiskSpace>>10) result=IntToStr(DiskSpace>>10) "KB"; else result=IntToStr(DiskSpace) "Bytes"; return result; } |
kraen4468
初階會員 發表:66 回覆:112 積分:35 註冊:2003-12-04 發送簡訊給我 |
|
JerryKuo
版主 發表:42 回覆:571 積分:322 註冊:2003-03-10 發送簡訊給我 |
引言: 我有試過你的程式碼,有點小錯誤,不過改一下就可以執行 執行出來的結果不是很正確,問題是出在這嗎? 我的問題就是執行出來的結果不是正確的 ~我還在學習狀態希望多多向您學習~你好: 問題應該出在變數型態的宣告, 1. unsinged long的值域為0~1073741823,所以只能支援到1GB的數目大小, 雖然輸入IntToSpace()的DiskSpace值大於1GB,在函數計算時,已經被縮減 為1GB,計算出的硬碟永遠不會超過1GB,最大都只有1G. 2. 以 __int64 取代unsinged long的變數型態,就可以秀出正確的硬碟空間 因為__int64可以支援足夠的值域。 void __fastcall TForm1::Button1Click(TObject *Sender) { char ch; int driver=1; AnsiString msg,drvroot="C:\\"; unsigned long SecPerCls,BytesPerSec,NumOfFreeCls,TotalNumOfCls; for(driver=1,ch='C';ch<='E';ch ) { if(driver) { drvroot.c_str()[0]=ch; if(GetDiskFreeSpace(drvroot.c_str(),&SecPerCls,&BytesPerSec, &NumOfFreeCls,&TotalNumOfCls)) { ListBox1->Items->Append(AnsiString(ch) ";\t" "Total " IntToSpace((__int64)SecPerCls*BytesPerSec*TotalNumOfCls) "(Free space: " IntToSpace((__int64)SecPerCls*BytesPerSec*NumOfFreeCls) " )"); } else ListBox1->Items->Append(AnsiString(ch) ":\tDriver not ready"); } } driver<<=1; } //-------------------------------------------------------------------- AnsiString __fastcall TForm1::IntToSpace(__int64 DiskSpace) { AnsiString result; if(DiskSpace>>20) result=IntToStr(DiskSpace>>20) "MB"; else if (DiskSpace>>10) result=IntToStr(DiskSpace>>10) "KB"; else result=IntToStr(DiskSpace) "Bytes"; return result; }發表人 - jerrykuo 於 2004/01/20 12:13:09 |
kraen4468
初階會員 發表:66 回覆:112 積分:35 註冊:2003-12-04 發送簡訊給我 |
|
dra
一般會員 發表:1 回覆:8 積分:1 註冊:2004-01-03 發送簡訊給我 |
void __fastcall TForm1::Button1Click(TObject *Sender) { char ch; int driver=1; AnsiString msg,drvroot="C:\\"; unsigned long SecPerCls,BytesPerSec,NumOfFreeCls,TotalNumOfCls; for(driver=1,ch='C';ch<='E';ch ) { if(driver) { drvroot.c_str()[0]=ch; if(GetDiskFreeSpace(drvroot.c_str(),&SecPerCls,&BytesPerSec, &NumOfFreeCls,&TotalNumOfCls)) { ListBox1->Items->Append(AnsiString(ch) ":\tTotal " IntToSpace((double)SecPerCls*BytesPerSec*TotalNumOfCls) "(Free space: " IntToSpace((double)SecPerCls*BytesPerSec*NumOfFreeCls) " )"); } else ListBox1->Items->Append(AnsiString(ch) ":\tDriver not ready"); } } driver<<=1; } //--------------------------------------------------------------------------- AnsiString __fastcall TForm1::IntToSpace(double DiskSpace) { AnsiString result; if(DiskSpace > 1<<30) result=FloatToStrF(DiskSpace/(1<<30),ffGeneral,3,1) "GB"; else if (DiskSpace > 1<<20) result=FloatToStrF(DiskSpace/(1<<20),ffGeneral,3,1) "MB"; else if (DiskSpace > 1<<10) result=FloatToStrF(DiskSpace/(1<<10),ffGeneral,3,1) "KB"; else result=FloatToStr(DiskSpace) "Bytes"; return result; } |
kraen4468
初階會員 發表:66 回覆:112 積分:35 註冊:2003-12-04 發送簡訊給我 |
|
JerryKuo
版主 發表:42 回覆:571 積分:322 註冊:2003-03-10 發送簡訊給我 |
|
conundrum
尊榮會員 發表:893 回覆:1272 積分:643 註冊:2004-01-06 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |