複数条件のファイル検索をするには?

解決


  2007-04-05 11:44:07  No: 25622

プログラミング学習でファイル検索ソフトを目標で作っています。
それでファイル検索するとき、エクスプローラの検索機能のようにスペースで離した複数条件でファイル検索をしようと色々やってみてるのですがうまくいきません。
Delphi等プログラム初心者なので、アドバイスよろしくお願いします。


うんと  2007-04-05 12:30:55  No: 25623

単数ならできるんですね?
それを複数回繰り返せばいいんでは?


  2007-04-06 06:07:30  No: 25624

単数の条件検索はできていると思います。
でも、Edit内でスペースで離した任意の数で分割する方法と、分割した数の繰り返しの仕方かよくわかりません。
もう少しアドバイスお願いします


こあ  2007-04-06 07:18:15  No: 25625

僕もあまり詳しくないのですが、
TEditの内容を文字列として処理して、空白を処理するといけると思います。
文字列処理関数を調べて見てください。


deldel  2007-04-06 17:53:19  No: 25626

「スペースで離した任意の数で分割」は、以下のようなコードでできますよ。

var
  sl: TStringList;
begin
  sl := TStringList.Create;
  try
    sl.CommaText := 'aaa bbb ccc';
    showmessage(sl[0]);
    showmessage(sl[1]);
    showmessage(sl[2]);
  finally
    sl.Free;
  end;
end;


  2007-04-06 21:13:19  No: 25627

こあさん、deldelさん参考になりました。
別の方法でコードを作っていましたが、連続したスペースの処理などうまくいきませんでしたし結構長いコードになっていたので、大変参考になりました。

それともう一つ、検索を複数回繰り返して条件を満たすやり方のアドバイスももう少しお願いします。


deldel  2007-04-06 23:22:51  No: 25628

TStringList の LoadFromFile でファイルを読み込み、
上記のコードの例ですと、
  if (Pos(sl[0], リスト.Text) <> 0) and
     (Pos(sl[1], リスト.Text) <> 0) and
     (Pos(sl[2], リスト.Text) <> 0) then
    全部ある!!

という感じでできませんかねぇ?(試してませんが・・・)


風来坊  2007-04-07 01:18:28  No: 25629

まるごと貼っちゃいますが、こういうことでいいのかな。
もしかしてテキストファイル内の文字列検索?

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure TntFormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure TntFormDestroy(Sender: TObject);
  private
    { Private 宣言 }
    FMaskList: TStringList;
    function Match(const FileName: String): Boolean;
    procedure Find(const S: String);
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

uses
  Masks, FileCtrl;

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  FMaskList := TStringList.Create;
  FMaskList.CommaText := '*.pas *.dfm';
end;

function TForm1.Match(const FileName: String): Boolean;
var
  I: Integer;
begin
  for I := 0 to FMaskList.Count - 1 do
    if MatchesMask(FileName, FMaskList[I]) then
    begin
      Result := True;
      Exit;
    end;
  Result := False;
end;

procedure TForm1.Find(const S: String);
var
  SR: TSearchRec;
begin
  if FindFirst(S + '\*.*', faAnyFile, SR) = 0 then
  begin
    repeat
      if (SR.Name <> '.') and (SR.Name <> '..') then
        if (SR.Attr and faDirectory) <> 0 then
          Find(S + '\' + SR.Name)
        else if Match(S + '\' + SR.Name) then
          Memo1.Lines.Add(S + '\' + SR.Name);
    until FindNext(SR) <> 0;
    FindClose(SR);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  S: String;
begin
  if SelectDirectory('フォルダの選択', '', S) then
  begin
    if IsDelimiter('\', S, Length(S)) then
      SetLength(S, Length(S) - 1);
    Find(S);
  end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  FMaskList.Free;
end;

end.


  2007-04-07 03:03:54  No: 25630

deldelさん、ありがとうございます。
教えていただいたコードを組み込むことで条件通りのファイルを表示させることができました。
TStringListに保存された数にあわせて
(Pos(sl[0], リスト.Text) <> 0) and
の部分を増やしていくとなるとなると、どういうコードにすればいいですか?


  2007-04-07 03:31:42  No: 25631

風来坊さん、ありがとうございます。
やりたかったことは、風来坊さんが書いていただいた様な事です。
大変参考になりました。
教えていただいたやり方を参考に、色々試して学んでいきます。


Fusa  URL  2007-04-07 08:54:50  No: 25632

解決しているところ、恐縮なのですが

http://delfusa.main.jp/delfusalibrary/20060527212010/WordDecompose/WordDecompose.pas

WordCountとか、WordGetとか、Split関数を
使ってみてくれると、文字列分解が楽かと思います。


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

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






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