フルパスを列挙について

解決


keiko  2006-05-30 07:47:54  No: 21910

こんにちは、keikoです。
delphi6にチャレンジしている超初心者です。
早速、質問ですが、
あるフォルダのフルパスからその中にあるファイルのファイル名(サブフォルダ内もすべて)をフルパスでmemoコンポーネントに列挙したいのですが、どうしたらよいかわかりません。
どなたか、お分かりの方、ご教授していただけないでしょうか。
よろしくおねがいいたします。


ん?  2006-05-30 08:16:42  No: 21911

FindFirst、FindNext


igy  2006-05-30 08:25:53  No: 21912

サブフォルダは再帰呼び出しで。


recursion  2006-05-30 08:31:45  No: 21913

サブフォルダ内まで列挙なら再帰呼出


リカーシブコール  2006-05-30 10:14:41  No: 21914

再帰呼出(リカーシブコール)理解できれば初心者脱出かな?


Fusa  2006-05-30 11:14:23  No: 21915

http://www.wwlnk.com/boheme/delphi/tips/tec0270.htm
こちらどうぞ。


keiko  2006-05-30 14:58:20  No: 21916

おはようございます。
keikoです。
一晩のうちに、初心者の私のために、こんなに多くの方々にヒントを頂き、感激しています。
早速、あれこれ試してみたいと思っています。
ありがとうございました。
また、さらに情報提供していただける方おりましたら、引き続きよろしくお願いします。


んー  2006-05-31 02:26:48  No: 21917

これでよければ、どうぞ。
function EnumFilesIn( dir: string; keywords:TStrings; dest: TStrings):boolean;
var
    path: string;
    sr: TSearchRec;
    attr: integer;
    i: integer;
    bl: boolean;
begin
{
  faReadOnly  = $00000001;
  faHidden    = $00000002;
  faSysFile   = $00000004;
  faVolumeID  = $00000008;
  faDirectory = $00000010;
  faArchive   = $00000020;
  faAnyFile   = $0000003F;
}
    Result:=False;
    if not Assigned( dest) then Exit;
    if not Assigned( keywords) then Exit;

    attr:= faAnyfile or faDirectory;
    path:= IncludeTrailingBackSlash( dir);
    if FindFirst( path+'*.*',attr,sr)=0 then
    try
        repeat
            if (sr.Name<>'.') and (sr.Name<>'..') then
            begin
                if (sr.Attr and faDirectory)=faDirectory then
                begin
                    bl:=EnumFilesIn( path+sr.Name, keywords, dest);
                    Result:=Result or bl;
                end else
                begin
                    if keywords.Count>0 then
                    begin
                        bl:=True;
                        for i:=0 to keywords.Count-1 do
                        begin
                            bl:= bl and (pos(
                                AnsiUpperCase(keywords[i]),AnsiUpperCase(path+sr.Name))>0);
                            if not bl then break;
                        end;
                        if bl then dest.Add(path+sr.Name);
                    end else
                    begin
                        dest.Add(path+sr.Name);
                    end;
                    Result:=Result or ((sr.Attr and (not faVolumeID))>0);
                end;
            end;
        until FindNext(sr)<>0;
    finally
        FindClose(sr);
    end;
end;

function EnumFilesIn( 
    dir: string;            //走査したいディレクトリ
    keywords:TStrings;      //フルパスとの一致を試みるキーワード
    dest: TStrings          //出力先のTStrings。TMemo.Linesとか。
    ):boolean;              //ファイルが見つかれば Trueを返す

keywords,dest は、あらかじめインスタンスを作成しておくこと。

keywordsは、 "Program Files" だったり ".pas" だったり。
*.pas とは指定できないところが味噌。

再帰検索処理で
c:\ とかやった日には結構時間かかる。

んで、マルチスレッド版がすでにあるので
そちらのほうも、よろしければどうぞ。

私用のアプリケーション用に、最後のツメで機能の補完を目的に書いたもので
ちょっと関係ない処理が入っているのですが、まあ使えると思います。
できたてホヤホヤだけど今のところ問題なし。
私は興味なくなるとバグを放置するタイプの人間なので、その辺の所よろしく。
ご利用は自己責任で。著作権とかは放置で。

http://www16.ocn.ne.jp/~fort_h/EnumFiles.zip

においておきます。


keiko  2006-05-31 08:02:01  No: 21918

んーさん、こんばんは。
初心者にはいまのところ、ちんぷんかんぷんですが、
大切に使わせていただきます。
ありがとうございました。


んー  2006-05-31 16:46:54  No: 21919

バグ発見(汗)
先日のリンク先においてあるファイルは、直してあります。

EnumFiles.zip Unit1.pasの一番最後のブロックにある(319行目)
>if (Sender as TEnumFiles).Aborted then
は、TForm1.abortClick(); で True になることは無い。

TForm1.abort1Click では
>FThEnumFiles.Terminate;
とやっていて FAborted フラグは変化しないためです。

ボタンでスレッドを停止する事は想定して
いなかったので、忘れました。

procedure TEnumFiles.AbortNow;
begin
  FAborted:=True;
  Terminate;
end;

というメソッドをつくり、それをTForm1.abort1Clickで
呼び出すようにしましょう。

失礼しました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加