指定したフォルダー以下について、サブフォルダ以下も含めた、ファイル数をフォルダーごとに得たいと思いますが解決できません。
各フォルダーごとのファイル数を得るまでの知識はあります。
例
パス名/このフォルダのファイル数/このフォルダ以下も含めたファイル数
c:\Test/10/28 10+5+13=28
c:\Test\subF1/5/5
c:\Test\SubF2/6/13 6+7=13
c:\Test\SubF2\subF22/7/7
再帰呼び出しという手法を使います。
unit GetFilesCountMain;
interface
uses Windows, ....
type
TForm1 = class(TForm)
Button1: TButton;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
private
{ Private 宣言 }
Count: Integer;
procedure GetFilesCount(const Path: String);
public
{ Public 宣言 }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
Folder: String;
begin
Folder := Get対象FolderName;
Count := 0;
GetFilesCount(Folder);
Label1.Caption := IntToStr(Count);
end;
procedure TForm1.GetFilesCount(const Path: String);
var
Res: Integer;
SearchRec: TSearchRec;
Attri: Integer;
S: String;
begin
// Pathの最後が'\'でない場合、'\'を加える = 重要
// IncludeTrailingPathDelimiter()がないVersionでは
// IncludeTrailingBackslash()を使用
// それもないversionでは、
// if not IsPathDelimiter() then S := Path + '\'
S := IncludeTrailingPathDelimiter(Path);
Res := FindFirst(S + '*.*', faAnyFile, SearchRec);
try
try
while Res = 0 do
begin
Attri := (SearchRec.Attr) and faDirectory;
if (Attri <> faDirectory) then Inc(Count)
else
if (SearchRec.Name <> '.') and (SearchRec.Name <> '..') then
GetFilesCount(S + SearchRec.Name); // 再帰呼び出し
Res := FindNext(SearchRec);
end;
except
Showmessage('ファイル数の取得に失敗しました。');
end;
finally
FindClose(SearchRec);
end;
end;
end.
どうもありがとうございました。
お示しいただいたのは、合計のファイル数を得る方法かと思いますが、私が今やりたいのはフォルダごとの情報をリスト出力できなくて困っています。
今一度、ご教授をお願いします。
> フォルダごとの情報をリスト出力できなくて困っています。
例えば
1.上記コードを改良してTStringList などへフォルダだけの一覧表を作ります。
2.上記コードと一覧表を利用してフォルダごとのデータを取得します。
どうもありがとうございました。
教えていただいた方法でやってみます。
ツイート | ![]() |