|
15番会議室「FAQ編纂委員会」に寄せられた「よくある質問の答え」
[Q]
指定ディレクトリ下にあるファイルを全て列挙したいのですが、、
指定ディレクトリ下にあるファイルを全て消去したいのですが、
[A]
再帰処理と、FindFirst/FindNextを使います。
ディレクトリ内のファイルを検索し、そのファイルがディレクトリ
だったらそのディレクトリ内のファイルを検索するようにします。
このとき、'ディレクトリ内のファイルを検索する'のに同じ関数を
使うのがポイントです。
消去の時は帰ってきたStringListの一番最後からファイルを消すように
すれば全て消すことができます。 そのときはReadOnly/Hiddenを解除する
をTrueにしておいた方がいいでしょう。
[例]
procedure ListFiles
(dirName: String;{ディレクトリフルパス}
attr: Word;
{ファイルの属性,全てならfaAnyfile(attr無しは含まれない)}
addnoattr:boolean;{True:属性なしファイルを加える}{☆修正}
clrFlag: boolean;{True:新規 false:つけ足す }
theList: TStringList;{一覧を格納するTStringList}
gosubdir:boolean;{True:サブディレクトリも検索する}
addYen:boolean;{True:ディレクトリなら\をつける}
noreadonly: Boolean{True:ReadOnly/Hiddenをはずす});
{sample
ListFiles ('c:\windows', faAnyFile,True,True,
newStringList,True,True,false);}
var
RC,p : Integer;
SearchRec : TSearchRec;
ss: String;
begin
if copy(dirname,length(dirname),1)<>'\' then dirname:=dirname+'\';
{上記\有無判別は手抜き、マルチバイト文字を考慮して行うべき}
if clrFlag Then TheList.Clear ;
RC := FindFirst(dirName+ '*.*', faAnyfile, SearchRec);
try
{$IFDEF WIN32}
while RC = 0 do{ver2.0のとき}
{$ELSE}
while RC<>-18 do{Ver1.0のとき}
{$ENDIF}
begin
if (SearchRec.Name <> '..') and (SearchRec.Name <> '.')
then
begin
ss := dirName + SearchRec.Name;
if noreadonly then
FileSetAttr(ss, SearchRec.Attr and
(not faReadOnly) and
(not faHidden) );
if (SearchRec.Attr And faDirectory > 0) then
begin
if addyen then
begin
if copy(ss,length(ss),1)<>'\' then
ss:=ss+'\';
end;
end;
if (SearchRec.Attr And attr > 0) or
((SearchRec.Attr=0) and addnoattr)
then
begin
theList.Add(ss);
end;
if gosubdir and (SearchRec.Attr And faDirectory > 0)
then
ListFiles(ss, attr,addnoattr,false,
TheList,true,True, noreadonly);
end;
RC := FindNext(SearchRec);
end;
finally
sysutils.FindClose(SearchRec);
end;
end;
{使用例 Form1にEdit1,ListBox1,Button1を配置して、、}
procedure TForm1.Button1Click(Sender: TObject);
var
newStringList:TStringList;
begin
newStringList:=TStringList.create;
ListFiles ('c:\windows', faAnyFile,True,True,
newStringList,True,True,false);
ListBox1.items.Assign(newStringList);
newStringList.free;
end;
{削除例Button2を配置して}
procedure TForm1.Button2Click(Sender: TObject);
var
i:integer;
begin
for i:=ListBox1.items.count-1 downto 0 do
begin
if not deletefile(Listbox1.items[i]) then
removedir(Listbox1.items[i]);
end;
end;
ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum FDELPHIに寄せられる質問の中から、よくある質問への回答を FDELPHIのメンバーがまとめたものです。 したがって、これらの回答はボーランド株式会社がサポートする公式のものではなく、掲示されている内容についての問い合わせは受けられない場合があります。
Copyright 1996-1998 Delphi Users' ForumFAQ編纂委員会
|