FindFirstのワイルドカード使用時

解決


クリップ  2004-12-16 19:15:56  No: 12334

いつもお世話になっています。クリップです。

今回はFindFirst関数でワイルドカードを使用して、ファイルの検索をしようとしているんですが、
procedure TForm1.Button1Click(Sender: TObject);
var
  Sr:TSearchRec;
  FilterStr:string;
begin
Memo1.Clear;
FilterStr:= '*1*';
if FindFirst('E:\Test\' + FilterStr + '.*', faAnyFile, Sr)=0 then
begin
  repeat
    if (Sr.Attr and faDirectory)=0 then
      Memo1.Lines.Add(Sr.Name);
  until FindNext(Sr)>0;
end;
FindClose(Sr);
end;

とすると、FilterStrを上記のソースのように('*1*')すると
すべてのファイルを拾ってしまいます。他の数値では問題ありません。
また、
FilterStr:= '*1' とか
FilterStr:= '1*' だとちゃんと条件に合ったものを拾ってくれます。

なにとぞ、よろしくお願いします。


ボード  2004-12-16 20:19:19  No: 12335

http://homepage3.nifty.com/m-and-i/tips/wildmatch.htm
が参考になるかもしれません。


Basser  2004-12-16 21:05:39  No: 12336

ファイル名をMasksユニットのMatchesMask関数でチェックすればいいと思います。


Basser  2004-12-16 22:26:49  No: 12337

スミマセン撤回します。
2バイト文字に対応していないので改良する必要があるのと、
パッケージによっては存在しない関数のようです。
(Delphi5 Professional には存在しています)


Basser  2004-12-16 23:14:57  No: 12338

追加です。
MatchesMask関数の他にもShlwapi.dllに
PathMatchSpec というAPIが存在します。
こちらもOSの環境に依存するのですが、
MSDNを見る限りではIE4以降なら問題ないかと...


クリップ  2004-12-16 23:28:13  No: 12339

ボードさん Basserさん レスありがとうございます。

やはりFindFirst関数だけでは、無理みたいですね。
ためしの API のFindFirstFileでもやってみたんですけどダメでした。

Basserさんはいろいろと調べていただいてどうもです。
PathMatchSpecでいってみようと思います。

本当にどうもありがとうございました。


Basser  2004-12-16 23:41:32  No: 12340

>やはりFindFirst関数だけでは、無理みたいですね。
>ためしの API のFindFirstFileでもやってみたんですけどダメでした。

Windowsのファイル検索でも同じ結果になりましたよ(^^;)
Windows 98SEです。


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

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






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