|
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編纂委員会
|