お知らせ

電子会議

ライブラリ

FDelphi サイト全文検索

Delphi FAQ一覧

サンプル蔵



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