开发者

How to search different file types using FindFirst?

开发者 https://www.devze.com 2023-03-05 10:42 出处:网络
In my Application I use the following procedure to recursively scan any folder and subfolders, if the folder开发者_StackOverflow社区 contains Text Files (*.txt) I add the filename to a TStringList def

In my Application I use the following procedure to recursively scan any folder and subfolders, if the folder开发者_StackOverflow社区 contains Text Files (*.txt) I add the filename to a TStringList defined in my procedure:

procedure FileSearch(const PathName: string; var lstFiles: TStringList);
const
  FileMask = '*.txt';
var
  Rec: TSearchRec;
  Path: string;
begin
  Path := IncludeTrailingBackslash(PathName);
  if FindFirst(Path + FileMask, faAnyFile - faDirectory, Rec) = 0 then
    try
      repeat
        lstFiles.Add(Path + Rec.Name);
      until FindNext(Rec) <> 0;
    finally
      FindClose(Rec);
    end;

  if FindFirst(Path + '*.*', faDirectory, Rec) = 0 then
    try
      repeat
        if ((Rec.Attr and faDirectory) <> 0) and (Rec.Name <> '.') and
          (Rec.Name <> '..') then
          FileSearch(Path + Rec.Name, lstFiles);
      until FindNext(Rec) <> 0;
    finally
      FindClose(Rec);
    end;
end;

Everything works perfect, but I want to be able to search for multiple file extensions. I have tried modifying the FileMask to do this but each time it returns nothing, likely because it is looking for an invalid extension. I have tried each of the following with no luck: (tried one at a time obviously, I did not write the below lines 3 times in my procedure)

FileMask = '*.txt|*.rtf|*.doc';

FileMask = '*.txt;*.rtf;*.doc';

FileMask = '*.txt,*.rtf,*.doc';

I feel silly for asking this, but how do I allow the extra file extensions to be included in the search? I can do it for Open and Save dialogs, why cant I separate the extensions here?

Thanks.

Craig.


Change your function so it accepts a list of extensions as well, separated by semicolons or some other delimiter. You can then check the existence of each found file's extension in that list of extensions, and if it's found add it to your stringlist.

Something like this should work:

procedure FileSearch(const PathName: string; const Extensions: string;
 var lstFiles: TStringList);
const
  FileMask = '*.*';
var
  Rec: TSearchRec;
  Path: string;
begin
  Path := IncludeTrailingBackslash(PathName);
  if FindFirst(Path + FileMask, faAnyFile - faDirectory, Rec) = 0 then
    try
      repeat
        if AnsiPos(ExtractFileExt(Rec.Name), Extensions) > 0 then
          lstFiles.Add(Path + Rec.Name);
      until FindNext(Rec) <> 0;
    finally
      SysUtils.FindClose(Rec);
    end;

  if FindFirst(Path + '*.*', faDirectory, Rec) = 0 then
    try
      repeat
        if ((Rec.Attr and faDirectory) <> 0) and (Rec.Name <> '.') and
          (Rec.Name <> '..') then
          FileSearch(Path + Rec.Name, Extensions, lstFiles);
      until FindNext(Rec) <> 0;
    finally
      FindClose(Rec);
    end;
end;

Sample call:

FileSearch('C:\Temp', '.txt;.tmp;.exe;.doc', FileList);


In Delphi XE7 this line of code generates (line 17) an error:

finally
  SysUtils.FindClose(Rec);
end;

To correct the error I just deleted SysUtils. to read this code:

finally
  FindClose(Rec);
end;

Now the code compile fine. Thanks for this very useful code and solution.

0

精彩评论

暂无评论...
验证码 换一张
取 消