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
|