こんにちは、keikoです。
delphi6にチャレンジしている超初心者です。
早速、質問ですが、
あるフォルダのフルパスからその中にあるファイルのファイル名(サブフォルダ内もすべて)をフルパスでmemoコンポーネントに列挙したいのですが、どうしたらよいかわかりません。
どなたか、お分かりの方、ご教授していただけないでしょうか。
よろしくおねがいいたします。
FindFirst、FindNext
サブフォルダは再帰呼び出しで。
サブフォルダ内まで列挙なら再帰呼出
再帰呼出(リカーシブコール)理解できれば初心者脱出かな?
http://www.wwlnk.com/boheme/delphi/tips/tec0270.htm
こちらどうぞ。
おはようございます。
keikoです。
一晩のうちに、初心者の私のために、こんなに多くの方々にヒントを頂き、感激しています。
早速、あれこれ試してみたいと思っています。
ありがとうございました。
また、さらに情報提供していただける方おりましたら、引き続きよろしくお願いします。
これでよければ、どうぞ。
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
においておきます。
んーさん、こんばんは。
初心者にはいまのところ、ちんぷんかんぷんですが、
大切に使わせていただきます。
ありがとうございました。
バグ発見(汗)
先日のリンク先においてあるファイルは、直してあります。
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で
呼び出すようにしましょう。
失礼しました。
ツイート | ![]() |