お知らせ

電子会議

ライブラリ

FDelphi サイト全文検索

Delphi FAQ一覧

サンプル蔵



FDelphi FAQ
15番会議室「FAQ編纂委員会」に寄せられた「よくある質問の答え」

[Q]
ファイルサイズはどうやって取得すればいいのでしょう? FileSize(var F) 関数がありますが、ヘルプには、「テキストファイルに対しては使えません」 とあります。

[A]
いくつかの方法があります。いずれも、テキスト、バイナリを問いません。

1:FindFirst 関数
2:TFileStream
3:FileSeek 関数

 推奨は1です。何せ高速です。2、3は以下のコード例でもわかりますが、
ファイルをオープンしてファイルポインタを動かす操作が伴いますので、300
ファイル、計 9M とかをまとめて操作すると、1は数秒ですが、2、3では
トイレに行けます(ゆっくりコーヒーが飲めます)。このことは、2、3で
盛んにハードディスクアクセスが観察でき、1は、観察した限りでは、アク
セスが見られなかったことと対応しています。
 じゃあ、何でもかでも1を使えばいいかというと、そうでもないですね。
1〜10 ファイルとかだと、そのときの処理がちょうど、例えば TFileStream 
を必要としてるなら、これ使って、ほとんどとろさは感じられません。
[例]
1:FindFirst 関数
 FindFirst 関数で SearchRec: TSearchRec レコードを取得し、
    SearchRec.Size
で得られます。

 ○次のコードは、DirectoryListBox1 コンポーネントと FileListBox1コン
ポーネントを並べて、FileListBox1 に表示されたファイルの数とサイズの合
計を、それぞれ Fcount と SumSize に集計します。

    SumSize:=0; Fcount:=0;                {longint}
    fCurDir1:=PutYenMark(DirectoryListBox1.Directory);
                        {末尾に'\'がなければ添加します。カスタム関数}
    iCount:=FileListBox1.Items.Count;     {integer}
    for i:=0 to iCount-1 do begin
      ItemFile:=FileListBox1.Items[i];    {TFilename=string[79]}
      if FindFirst(fCurDir1+ItemFile,
        faReadOnly+faArchive,             {+faHidden+faSysFile}
        {FileListBox1 の FileType プロパティーを ftNormal にしたとき}
        vSearchRec)=0 then begin          {vSearchRec: }
        inc(SumSize,vSearchRec.Size);     {  TSearchRec}
                   {~~~~~~~~~~~~~~~これです!}
        inc(Fcount);
      end;
    end;{next i}

2:TFileStream
 FileStream1: TFileStream でファイルを開き、
    FileStream1.Size
で得られます。

 ○次のコードは、FileListBox1 に表示されたファイルをマウスクリックし
たとき、そのサイズを Label1 に表示します。

    procedure TForm1.FileListBox1Click(Sender: TObject);
    var
      i,iCount
            : integer;
      FileStream1: TFileStream;
    begin
      iCount:=FileListBox1.Items.Count;
      if iCount=0 then exit;
      for i:=0 to iCount-1 do
        if FileListBox1.Selected[i] then begin
          FileStream1:=TFileStream.Create(
            PutYenMark(FileListBox1.Directory)+
            FileListBox1.Items[i],
            faOpenRead);
          try
            Label1.Caption:=IntToStr(FileStream1.Size);
                                    {~~~~~~~~~~~~~~~~これです!}
          finally
            FileStream1.Free;
          end;
        end;
      {next i}
    end; {TForm1.FileListBox1Click}

    【注意】この場合には、FileListBox1 の MultiSelect プロパティーは
    false に設定して下さい。

3:FileSeek 関数
 FileSeek(FileHandle,0,2) が、ファイルポインタをファイルの終わりから
0 バイト(つまりファイルの終わりってこと)の位置に設定し、その位置を
返す、つまりファイルサイズを返すことを利用します。

 ○次のコードは、あるディレクトリーから拾ってきて ListBox1 に表示さ
れたファイルの内、選択されたファイルの合計サイズを Label1 に表示しま
す。

    procedure TForm1.Button1Click(Sender: TObject);
    var
      FileHandle,
      i,iCount
            : integer;
      SumSize: longint;
      ItemFile: TFilename;
    begin
      iCount:=ListBox1.Items.Count;
      if iCount=0 then exit;
      SumSize:=0;
      for i:=0 to iCount-1 do
        if ListBox1.Selected[i] then begin
          ItemFile:=CurDir+ListBox1.Items[i];
                 {CurDir: わかっているテ゛ィレクトリー。PutYenMark済とします}
          FileHandle:=FileOpen(ItemFile,fmOpenRead);   {fmOpenRead=0}
          try
            inc(SumSize,FileSeek(FileHandle,0,2));
          finally
            FileClose(FileHandle);
          end;
        end;
      {next i}
      Label1.Caption:=IntToStr(SumSize);
    end; {TForm1.Button1Click}

【補足】PutYenMarkって、ディレクトリー操作に付きものです。何でもない
関数です。この反対の GetDirectory(末端から、ルートディレクトリー以
外は'\'を取る)ってのも必須ですね。


ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum FDELPHIに寄せられる質問の中から、よくある質問への回答を FDELPHIのメンバーがまとめたものです。 したがって、これらの回答はボーランド株式会社がサポートする公式のものではなく、掲示されている内容についての問い合わせは受けられない場合があります。

Copyright 1996-1998 Delphi Users' ForumFAQ編纂委員会