[delphi技术]文件搜索等几个文件处理函数

本文介绍了两个Delphi中用于文件处理的重要函数:SearchFile用于搜索指定路径下匹配特定类型的文件,而CheckFileName则用于检查并替换文件名中的非法字符。SearchFile通过遍历目录和子目录来查找匹配的文件,并将结果添加到列表中。CheckFileName函数则确保文件名符合系统规定,避免包含特殊字符。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//搜索函数
procedure SearchFile(mainpath: string; ExpList: TStringList; var list:
  TStringList; SearchChildDir: Boolean = True);
//ExpList 文件类型
var
  SearchRec: TsearchRec;
  i: integer;
begin
  if FindFirst(mainpath + '*', faAnyFile, SearchRec) = 0 then
  begin
    repeat
      Application.ProcessMessages;
      if (SearchRec.Name = '.') or (SearchRec.Name = '..') then
        Continue;
      if ((SearchRec.attr and fadirectory) <> fadirectory) then //如果是文件
        for i := 0 to ExpList.Count - 1 do
        begin
          if AnsiEndsText(ExpList.Strings[i], SearchRec.Name) then
          begin
            list.Add(Mainpath + SearchRec.Name);
            Break;
          end;
        end
      else
        if SearchChildDir then
          Searchfile(mainpath + SearchRec.Name + '/', ExpList, list);
    until FindNext(SearchRec) <> 0;
    FindClose(SearchRec);
  end;
end; //SearchFile

//替换文件名中的非法字符
function CHeckFileName(sFileName: string; sReplaceStr: string = ''): string;
var
  i: Integer;
  sChar: string;
const
  LawlessChar = '//:*?"<>|';
begin
  for i := 1 to Length(LawlessChar) do
  begin
    sChar := LawlessChar[i];
    StrReplace(sFileName, sChar, sReplaceStr);
  end;
  Result := sFileName;
end;

//被上上面用到的一个函数
procedure StrReplace(var s:String;substr1:String;substr2:String);
var
  i:Integer;
  ts:String;
begin
  ts:=s;
  s:='';
  i:=1;
  while True do
  begin
    if Copy(ts,i,length(substr1))=substr1 then
    begin
      s:=s+substr2;
      i:=i+length(substr1)
    end
    else
    begin
      s:=s+Copy(ts,i,1);
      i:=i+1;
    end;
    if i>length(ts) then break;
  end;
end;

搜索TXT 文件的示例unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ComCtrls, Vcl.ExtCtrls; type TForm1 = class(TForm) ListBox1: TListBox; Memo2: TMemo; Panel1: TPanel; Label1: TLabel; Label2: TLabel; Label3: TLabel; Edit1: TEdit; ButtonSearchFile: TButton; FolderPath: TEdit; FileExt: TEdit; ProgressBar1: TProgressBar; procedure ButtonSearchFileClick(Sender: TObject); procedure ListBox1Click(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private declarations } procedure SearchFile1(FileName: string; FindText: string); function MakeFileList(Path, FileExt: string): TStringList; function FileInUsed(FileName: TFileName): Boolean; public { Public declarations } end; var Form1: TForm1; implementation uses StrUtils; {$R *.dfm} { Search Options KeyWord in file FileName FileSize FileCreateTime FileModifyTime keyword filepath openfile found addListbox } var FileNamePathList, FileNameList: TStringList; procedure TForm1.FormCreate(Sender: TObject); begin FileNameList := TStringList.Create; FileNamePathList := TStringList.Create; end; { if FileInUsed ('D:\Administrator\Documents\MyProjects\FileSearch\Win32\Debug\Project1.exe') then ShowMessage('File is in use.') else ShowMessage('File not in use.'); } function TForm1.FileInUsed(FileName: TFileName): Boolean; var HFileRes: HFILE; begin Result := False; if not FileExists(FileName) then Exit; // 如果文件不存在,返回false HFileRes := CreateFile(PChar(FileName), GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); Result := (HFileRes = INVALID_HANDLE_VALUE); if not Result then CloseHandle(HFileRes); end; procedure TForm1.SearchFile1(FileName: string; FindText: string); var SearchList: TStringList; begin try SearchList := TStringList.Create; if FileExists(FileName) and (not FileInUsed(FileName)) then begin SearchList.LoadFromFile(FileName); if Boolean(Pos(UpperCase(FindText), UpperCase(SearchList.Text))) then begin FileNameList.Add(ExtractFileName(FileName)); FileNamePathList.Add(FileName); end; end; finally SearchList.Free; end; end; procedure TForm1.ButtonSearchFileClick(Sender: TObject); var I, n: Integer; List: TStringList; begin try ButtonSearchFile.Caption := 'SearchFile'; List := TStringList.Create; List.Clear; FileNameList.Clear; FileNamePathList.Clear; List := MakeFileList(FolderPath.Text, FileExt.Text); ProgressBar1.Max := List.Count; for I := 0 to List.Count - 1 do begin Application.ProcessMessages; SearchFile1(List[I], Edit1.Text); ProgressBar1.Position := I; end; ListBox1.Items.Text := FileNameList.Text; ButtonSearchFile.Caption := IntToStr(FileNamePathList.Count) + ' 条'; finally List.Free; end; end; { 这个过程得显示进度 } function TForm1.MakeFileList(Path, FileExt: string): TStringList; var sch: TSearchrec; begin Result := TStringList.Create; if RightStr(Trim(Path), 1) '\' then Path := Trim(Path) + '\' else Path := Trim(Path); if not DirectoryExists(Path) then begin Result.Clear; Exit; end; if FindFirst(Path + '*', faAnyfile, sch) = 0 then begin repeat Application.ProcessMessages; if ((sch.Name = '.') or (sch.Name = '..')) then Continue; if DirectoryExists(Path + sch.Name) then begin Result.AddStrings(MakeFileList(Path + sch.Name, FileExt)); end else begin if (UpperCase(ExtractFileExt(Path + sch.Name)) = UpperCase(FileExt)) or (FileExt = '.*') then Result.Add(Path + sch.Name); end; until FindNext(sch) 0; FindClose(sch); end; end; procedure TForm1.ListBox1Click(Sender: TObject); var s: string; txt: string; begin if not FileExists(FileNamePathList[ListBox1.ItemIndex]) then Exit; Memo2.Lines.LoadFromFile(FileNamePathList[ListBox1.ItemIndex]); Caption := FileNamePathList[ListBox1.ItemIndex]; txt := Form1.Memo2.Text; if Boolean(Pos(UpperCase(Edit1.Text), UpperCase(txt))) then begin Memo2.SetFocus; Memo2.SelStart := Pos(UpperCase(Edit1.Text), UpperCase(txt)) - 1; Memo2.SelLength := Length(Edit1.Text); end; end; end.
文件搜索控件 TEasyFileSearch v1.02 by Alexandre GAMBIER Read versions.txt file if you want to see modifications made between each version. Thanks ------ Thanks to : - Udo for his tests on C++ Builder 5 and his ideas for v1.01, v1.02 - J.M. Fontaine for his test on Delphi 7 and his orthography help for v1.01. 1 - DESCRIPTION --------------- TEasyFileSearch is freeware and you use it at your own risk. TEasyFileSearch is completely free also for commercial use. TEasyFileSearch is a component which enable you to search file or folder in directory and subdirectory, using filter mask (*.*, *.exe, ...). You define some search criteria : - look in subfolder , - look for readonly file , - look for hidden file , - look for system file , - look for archile file , - look for directory file, - look for anyfile file . You can filter your research - look for files that is smaller or equal to a size, - look for files that is bigger or equal to a size, - look for file than date is between two date, younger, older or the same than a date, - look for created, modified or opened files. You can exclude files using filter mask, for example you can exclude all files *.exe. TEasyFileSearch don't use recursive function (no stack owerflow error). 2 - LANGUAGE/OS --------------- TEasyFileSearch has been tested only on Delphi 5, 7 and C++ Builder 5. 3 - INSTALLATION ---------------- 1. Extract the TEasyFileSearch.zip 2. Choose Component|Install Component... from the menu 3. Select the Tab 'Into New Package' and fill in: At 'Unit file name': Browse and Select EasyFileSearchReg.pas from the directory where you installed it. At 'Package file name': TEasyFileSearch ( In the directory Projects\Lib ) At 'Description': TEasyFileSearch - looking for files Select Ok 4. You will be asked to confirm building the packag
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值