お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





FDelphi FAQ
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル

"ディスクの空き容量を取得(2GB超HD対応)"

この発言に対し以下のコメントが寄せられています
#00198 Satobe さん RE:ディスクの空き容量を取得(2GB超HD対応)

2GB超のハードディスクの空き容量を取得するために、GetDiskFreeSpaceEx という API が(Win95 OSR2,NT4.0で)追加されましたが、この APIが使えない Windows95も存在することから、使用方法が面倒な API となっています。 #Delphi 3用です(Delphi 2 は持ってないもので) uses Windows; //=================================================================== // ドライブの全容量・空き容量を取得する // 2GB超のハードディスクにも対応している(つもり) //------------------------------------------------------------------- // Entry // RootPathName 'C:\' のように文字列で指定する // AllBytes 全容量が代入される // FreeBytes 空き容量が代入される // 戻り値 // GetDiskFreeSpace(Ex) API の戻り値をそのまま返す // False なら容量の取得に失敗したと判断すること //=================================================================== function GetDiskFreeInfo(const RootPathName: String; var AllBytes, FreeBytes: Extended): Boolean; type TGetDiskFreeSpaceEx = function(const lpDirectoryName: PChar; var lpFreeBytesAvailableToCaller, lpTotalNumberOfBytes, lpTotalNumberOfFreeBytes: Comp) : BOOL; stdcall; var rc: Boolean; VerInfo: TOSVersionInfo; hLib: THandle; GetDiskFreeSpaceEx: TGetDiskFreeSpaceEx; CompFreeBytesToCaller, CompAllBytes, CompFreeBytes: Comp; lpSectorsPerCluster, lpBytesPerSector, lpNumberOfFreeClusters, lpTotalNumberOfClusters: Integer; begin {これはなくてもいいと思いますが(気分の問題)} FillChar(VerInfo, SizeOf(VerInfo), #0); VerInfo.dwOSVersionInfoSize := SizeOf(VerInfo); rc := GetVersionEx(VerInfo); {*}Assert(rc, 'GetVersionEx() Error!'); { Win95 ビルド番号のチェックが怪しい?} if ((VerInfo.dwPlatformId = VER_PLATFORM_WIN32_WINDOWS) and (VerInfo.dwBuildNumber > $04001000)) or ((VerInfo.dwPlatformId = VER_PLATFORM_WIN32_NT) and (VerInfo.dwMajorVersion >= 4)) then begin //Win95 OSR2以降 または NT4.0以降 hLib := LoadLibrary(PChar('KERNEL32.DLL')); {*}Assert(hLib<>0, 'LoadLibrary("KERNEL32.DLL") Error!'); try @GetDiskFreeSpaceEx := GetProcAddress(hLib, PChar('GetDiskFreeSpaceExA')); {*}Assert(@GetDiskFreeSpaceEx<>nil, 'GetProcAddress("GetDiskFreeSpaceExA") Error'); //ShowMessage('GetDiskFreeSpaceExA()を使います'); Result := GetDiskFreeSpaceEx(PChar(RootPathName), CompFreeBytesToCaller, CompAllBytes, CompFreeBytes); if Result then begin AllBytes := CompAllBytes; FreeBytes := CompFreeBytesToCaller; //FreeBytes := CompFreeBytes; end; finally FreeLibrary(hLib); end; end else begin Result := GetDiskFreeSpace(PChar(RootPathName), lpSectorsPerCluster, lpBytesPerSector, lpNumberOfFreeClusters, lpTotalNumberOfClusters); if Result then begin AllBytes := lpTotalNumberOfClusters * lpSectorsPerCluster * lpBytesPerSector; FreeBytes := lpNumberOfFreeClusters * lpSectorsPerCluster * lpBytesPerSector; end; end; end; //------------------------------------------------------------------- // GetDiskFreeInfo(); 使用例 // ~~~~~~~~~~~~~~~~~~~~~~~~~ // Form1 に DriveComboBox と Button を貼り付けておいてね //------------------------------------------------------------------- procedure TForm1.Button1Click(Sender: TObject); var RootPath: String; AllBytes, FreeBytes: Extended; begin RootPath := copy(DriveComboBox1.Text, 1, 2) + '\'; if GetDiskFreeInfo(RootPath, AllBytes, FreeBytes) = False then ShowMessage('GetDiskFreeInfo() Error') else ShowMessage(Format('AllBytes=%12.0n FreeBytes=%12.0n' ,[AllBytes,FreeBytes])); end; {*}Assert();部分は、MessageBoxを表示して Falseを返すように した方が良いかもしれません。 Win95 の場合のビルド番号のチェックは怪しいです。 Win98 でもこれで問題なく動作するのだろうか? vvvv Win95 +SP1(4.00.950a) これら3つのOSにて2GB未満の Win95 OSR2(4.00.950B) 記憶装置での正常動作を確認。 WinNT4.0+SP3 2GB超の記憶装置は持ってないもので... 2GB超のハードディスクをお持ちの方がいらっしゃいましたら、 動作を確認していただけると嬉しいです。 97/10/29(水) 02:43 Satobe(JCG00336) Original document by Satobe 氏 ID:(JCG00336)



ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。

Copyright 1996-2002 Delphi Users' Forum