ドライブの空き容量を取得できない

解決


ame  2010-01-19 23:29:44  No: 37078

ドライブの空き容量を取得するため、過去ログを参考にプログラムしてみました。
ところが、いくら、どのドライブをチェックしても、「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'));


deldel  2010-01-19 23:41:56  No: 37079

コンパイルエラーが出たので、以下の2箇所を変更すると、取得できましたが・・・(Win2K,D5)

function TForm1.GetDiskSpace(strDrive : AnsiString) :string;

  Size:= DiskFree(Ord(strDrive[1]) - Ord('A') + 1);


DEKO  2010-01-20 01:11:00  No: 37080

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;


ame  2010-01-20 21:00:02  No: 37081

deldelさま、DEKOさま
ありがとうございました。

そこが問題だったのですね。
難しい・・・どうすれば気付けるのか・・・。
修行が必要です。

お教え頂いた内容で解決しました。
ありがとうございました。


ame  2010-01-20 21:00:30  No: 37082

解決しました。
ありがとうございました。


tor  2010-01-20 23:17:03  No: 37083

解決した後で何ですが、whileの条件は i<=4 ではなく i<4 でないといけませんね。
このコードだと、1024TB以上になったらFigList[5]にアクセスしてしまいます。
実際にそこまで達することは当分ないでしょうけど…

> 難しい・・・どうすれば気付けるのか・・・。
元のコードだとコンパイルが通らないのですぐ気付くはずなんですが
Delphi2010だとOrdの仕様が変わっているんですかね。


ame  2010-01-21 02:12:59  No: 37084

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'));
に対して、きちんとディスク容量が返ってきた事がありました。
こちらは、さっぱり理由がわかりません(^^;


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加