ドライブの空き容量を取得するため、過去ログを参考にプログラムしてみました。
ところが、いくら、どのドライブをチェックしても、「Drive is not found.」になってしまいます。
何が原因かわかなくて行き詰まりました。
どうぞよろしくお願いいたします。
//------------------------------------------------------
// 環境: WinXp sp3、Delphi2010、HDD空き容量80GB
//------------------------------------------------------
function TForm1.GetDiskSpace(strDrive : string) :string;
var
Fig : string;
FigList : array[0..4] of string;
i : Integer;
Size : Extended;
begin
//空き容量取得
Size:= DiskFree(Ord(strDrive) - Ord('A') + 1);
//単位定義
FigList[0]:='Byte';
FigList[1]:='KB';
FigList[2]:='MB';
FigList[3]:='GB';
FigList[4]:='TB';
//単位変換
i:=0;
while (Size>=1024) and (i<=4) do
begin
Size:= Size / 1024;
Inc(i);
end;
Fig:= FigList[i];
//ラベルに表示
if Size>=0 then
result:= Format('%4.1f %s',[Size, Fig])
else if Size=-1 then
result:= 'Error: Drive is not found.'
else
result:= 'Error: ???';
end;
//--------------------------------
ShowMessage(GetDiskSpace('C'));
コンパイルエラーが出たので、以下の2箇所を変更すると、取得できましたが・・・(Win2K,D5)
function TForm1.GetDiskSpace(strDrive : AnsiString) :string;
Size:= DiskFree(Ord(strDrive[1]) - Ord('A') + 1);
DiskFree() の引数は Byte で、"A:"=1, "B:"=2, "C:"=3... となります。
Ord() は String の変換はできないので、deldel さんのコードのように、
strDrive[1] として、strDrive の最初の文字を Char 型で渡す必要があります。
function TForm1.GetDiskSpace(strDrive : string) :string;
var
Fig: string;
FigList: array[0..4] of string;
i: Integer;
Size: Extended;
begin
//空き容量取得
Size := DiskFree(Ord(strDrive[1]) - Ord('A') + 1);
if Size >= 0 then
begin
//単位定義
FigList[0] := 'Byte';
FigList[1] := 'KB';
FigList[2] := 'MB';
FigList[3] := 'GB';
FigList[4] := 'TB';
//単位変換
i := 0;
while (Size >= 1024) and (i <= 4) do
begin
Size := Size / 1024;
Inc(i);
end;
Fig := FigList[i];
result := Format('%4.2f %s', [Size, Fig]);
end
else if Size = -1 then
result := 'Error: Drive is not found.'
else
result := 'Error: ???';
end;
deldelさま、DEKOさま
ありがとうございました。
そこが問題だったのですね。
難しい・・・どうすれば気付けるのか・・・。
修行が必要です。
お教え頂いた内容で解決しました。
ありがとうございました。
解決しました。
ありがとうございました。
解決した後で何ですが、whileの条件は i<=4 ではなく i<4 でないといけませんね。
このコードだと、1024TB以上になったらFigList[5]にアクセスしてしまいます。
実際にそこまで達することは当分ないでしょうけど…
> 難しい・・・どうすれば気付けるのか・・・。
元のコードだとコンパイルが通らないのですぐ気付くはずなんですが
Delphi2010だとOrdの仕様が変わっているんですかね。
torさん
気付きませんでした。
ありがとうございます。
そうなんです、コンパイルが通ってしまうのです。D2010
あと、再現性を確保できないので書きませんでしたが、
Size:= DiskFree(Ord(strDrive) - Ord('A') + 1);
の部分の後に
if Size<0 then ShowMessage('Size<0');
if Size>0 then ShowMessage('Size>0');
を追加して原因を調べていた時に、たまに
ShowMessage(GetDiskSpace('C'));
に対して、きちんとディスク容量が返ってきた事がありました。
こちらは、さっぱり理由がわかりません(^^;
ツイート | ![]() |