⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unit1.~pas

📁 很不错文件搜索
💻 ~PAS
📖 第 1 页 / 共 2 页
字号:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, StrUtils,ComCtrls, ExtCtrls, Buttons,  OleServer,
  ShellApi, Menus,shlobj, jpeg, Unit3;
  //ComObj:com对象调用;shlobj:系统对象的调用
const WM_ThreadDoneMsg=WM_User+8;
type
   PMyRec=^MyRec;
   MyRec=record
     Dirstr:string;
     next:PMyRec;
   end;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    ListView1: TListView;
    PopupMenu1: TPopupMenu;
    N1: TMenuItem;
    D1: TMenuItem;
    StatusBar1: TStatusBar;
    Panel2: TPanel;
    Label3: TLabel;
    ComboBox1: TComboBox;
    Button2: TButton;
    Edit1: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Edit2: TEdit;
    BitBtn2: TBitBtn;
    BitBtn1: TBitBtn;
    Label4: TLabel;
    Label5: TLabel;
    Panel3: TPanel;
    Label6: TLabel;
    P1: TMenuItem;
    procedure FormCreate(Sender: TObject);
    procedure BitBtn1Click(Sender: TObject);
    procedure ListView1DblClick(Sender: TObject);
    procedure BitBtn2Click(Sender: TObject);

    procedure D1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure SpeedButton1Click(Sender: TObject);
    procedure BitBtn3Click(Sender: TObject);
    procedure Label5MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure P1Click(Sender: TObject);
    
  private
    { Private declarations }
    SearchTds1:TSearchThds;
    SearchTds2:TSearchThds;
    SearchTds3:TSearchThds;
    //procedure WMNChitTest(var Msg:TWMNChitTest);
   // Message   WM_NCHITTEST;
    procedure ThreadDone(var AMessage:TMessage);
    Message WM_ThreadDoneMsg;
    procedure InstallThds(TdsActive:boolean;LSearchThd:TSearchThds);
  public
    { Public declarations }
    ThdStop:boolean;
    Drivelist: TStrings;   //驱动器列表
    //finished:boolean;
    DirInfs:PMyRec;
    DirInfs2:PMyRec;
    SearchTotal:integer;

    SearchTds1Active:boolean;
    SearchTds2Active:boolean;
    SearchTds3Active:boolean;

    //procedure CreateParams(var Params:TCreateParams); override;

    procedure GetsystemLogicalDrivesInfo;
    procedure RecurSearchFile(CurrentDir: string; SearchFileType:string;LDirCase:integer);
    function  GetCurrentDriveType(DriveNumber: Pchar):Boolean;
    //function ToReadWordFile(FileName:string):Boolean;
    procedure SearchFileFound(FileFound: TSearchRec;FilePath: string);
    function  andx(str1:string;str2:string):integer;
    function ToSearchWord(FileNames:string;str:WideString):Boolean;
    //字符串分割
    function SplitString(const source,ch:string):TStringList;
    //function IsIncShiTiHao(FileNameStr:string;TeStrArry:TStrings):Boolean;
    function MatchStrings(source, pattern: String): Boolean;
    procedure  CreateDirInfs(var top:PMyRec);
    procedure PushDirInfs(var top:PMyRec;DirStr:string);
    procedure  PopDirInfs(var top:PMyRec;var Dirstr:string);
    procedure  ClearDirInfs(var top:PMyRec);

  end;

var
  Form1: TForm1;
  ShiTiHao: string;
  KeyWord: WideString;
  IntCase: integer;
  //StrArry :TStrings;
  ThreadsNumber:integer;
implementation

uses ComObj, Unit2;
{$R *.dfm}

 //获的驱动器类型
function TForm1.GetCurrentDriveType(DriveNumber:Pchar):Boolean;
var
  DriveType: WORD;  //定义驱动器类型变量。
begin
  DriveType:=Windows.GetDriveType(DriveNumber);
  if DriveType=DRIVE_FIXED then
    result:=True
  else
    result:=False;
end;
 //获得硬盘列表
procedure TForm1.GetsystemLogicalDrivesInfo;
var
  LocalDrives: set of 0..25;
  DriveNumber: Integer;
  Drives: string;

begin
  Drives:='';
  DWORD(LocalDrives):= Windows.GetLogicalDrives;
  for DriveNumber:=0 to 25 do
    begin
      if (DriveNumber in LocalDrives) and (GetCurrentDriveType(PChar(Chr(DriveNumber+Ord('A'))+':\'))) then
        begin
          DriveList.Add(chr(DriveNumber+Ord('A'))+':\');
          Drives:=Drives+Chr(DriveNumber+Ord('A'))+':\';
          ComboBox1.Items.Add(Chr(DriveNumber+Ord('A'))+':\');
        end;
    end;
  ComboBox1.Items.Add('驱动器  '+'('+Drives+')');
  ComboBox1.ItemIndex:=ComboBox1.Items.Count-1;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Drivelist:=TStringList.Create;

  //StrArry:=TStringList.Create;
  GetsystemLogicalDrivesInfo;
  ThdStop:=False;//////////////////
  
  BitBtn2.Enabled:=False;
  SearchTds1Active:=false;
  SearchTds2Active:=false;
  SearchTds3Active:=false;
  ThreadsNumber:=0;
  DirInfs:=nil;
  DirInfs2:=nil;

end;
 //word文档的内部查找
function TForm1.ToSearchWord(FileNames:string;str:WideString):Boolean;
var
  strs: WideString;
  WordApp,WordDoc,vRange: Variant;
  Found: Boolean;
begin

 try
   strs:=str;
   Found:=True;
   try
     WordApp:=CreateOleObject('Word.Application');
   except
     MessageDlg('Word可能没有安装!', mtError, [mbOk], 0);
     result:= False;
     ThdStop:=True;
     Exit;
   end;

   WordApp.Visible:=false;

  //调用Open函数打开文档
  try
    WordDoc:=WordApp.Documents.Open(FileNames);
  except
     result:= False;
     Exit;
  end;
   //选取中整个文档
   WordDoc.Select ;

   //查找范围
   vRange := WordDoc.Range ;




///////////////////////////////////////////////////////////////////////

 Found:=WordDoc.Range.Find.Execute(strs,,,,,,,,,,False) ;  

 ///////////////////////////////////////////////////////////////////
 finally
  WordDoc.Close(True) ; //关闭文并保存

  WordApp.Quit(False) ; //退出Word
 end;
 result:=Found;

end;


 //文件搜索
procedure TForm1.RecurSearchFile(CurrentDir:string;SearchFileType:string;LDirCase:integer);
var

  SearchRec:TSearchRec;
  Err:integer;
  FileExt:string;
  DirNumbers:integer;
begin
  //if NoStop then
  //begin
  DirNumbers:=0;
  Err:=FindFirst(CurrentDir+SearchFileType,$35,SearchRec);
 // FileExt:=ExtractFileExt(SearchRec.Name);
  while (Err=0) do
    begin
      if ThdStop then
        Break;
      if SearchRec.Name[1]<>'.' then
        begin
          if (SearchRec.Attr and faDirectory)=0 then
            begin
              StatusBar1.SimpleText:=CurrentDir+SearchRec.Name;
              FileExt:=ExtractFileExt(SearchRec.Name);
              Case IntCase of
              0:  SearchFileFound(SearchRec,CurrentDir);
              1:  if FileExt='.doc' then
                    if ToSearchWord(CurrentDir+SearchRec.Name,KeyWord) then
                       SearchFileFound(SearchRec,CurrentDir);
              2:  if FileExt='.doc' then
                    if  MatchStrings(SearchRec.Name,ShiTiHao) then
                      if ToSearchWord(CurrentDir+SearchRec.Name,KeyWord) then
                        SearchFileFound(SearchRec,CurrentDir);
              3:  if MatchStrings(SearchRec.Name,ShiTiHao) then
                     SearchFileFound(SearchRec,CurrentDir);
              end;
            end;
        end;
      if ((SearchRec.Attr and faDirectory)<>0) and (SearchRec.Name[1]<>'.') then
         begin
         case LDirCase of
           0:PushDirInfs(DirInfs,CurrentDir+SearchRec.Name+'\');
           1:PushDirInfs(DirInfs2,CurrentDir+SearchRec.Name+'\');
         end;
           //curSearchFile(CurrentDir+SearchRec.Name+'\','*.*',ShiTiHao,KeyWord,IntCase);
           //Dir('..');
         end;
      application.ProcessMessages;     //系统消息
      Err:=FindNext(SearchRec);
    end;
  //end
 // else


end;

procedure TForm1.BitBtn1Click(Sender: TObject);
var
  Ok:  Boolean;
  j:   Integer;
  
  lDirStr:string;
begin
  Ok:=True;
  if Trim(ComboBox1.Text)='' then
    begin
      MessageBox(Handle, '你必须选择搜索路径!', 'ERROR', MB_OK);
      Ok := False;
      Edit1.SetFocus;
    end;
if Ok=True then
  begin
    ListView1.SortType:=stNone;
    BitBtn1.Enabled:=False;

    ThdStop:=False;                     //查询停止条件的负值
    BitBtn2.Enabled:=True;            //停止按钮
    if (Trim(edit1.Text)='') then
      ShiTiHao := Trim(Edit1.Text)               //题根序号
    else
      ShiTiHao := '*'+Trim(Edit1.Text);
    //if ShiTiHao<>'' then
       //StrArry:=SplitString(ShiTiHao,' ');
    KeyWord := WideString(Trim(Edit2.Text));    //参考条件

    IntCase:=andx(ShiTiHao,KeyWord);  //查询条件的关系
    ThreadsNumber:=0;
    SearchTotal:=0;
    //if(DirInfs<>nil)then
       ClearDirInfs(DirInfs);
    //CreateDirInfs(DirInfs);
    //if(DirInfs2<>nil)then
       ClearDirInfs(DirInfs2);
    //CreateDirInfs(DirInfs2);

    ListView1.Clear; //将列表淸空

    if(ComboBox1.ItemIndex=ComboBox1.Items.Count-1) then
      for j:=0 to DriveList.Count-1 do
         //showmessage(Trim(DriveList.Strings[j]))
        RecurSearchFile(Trim(DriveList.Strings[j]),'*.*',0)
    else
      //showmessage(Trim(ComboBox1.Text));
       RecurSearchFile(Trim(ComboBox1.Text),'*.*',0);
  end;
  if (DirInfs<>nil) then
  begin
     while(DirInfs<>nil)do
     begin
       PopDirInfs(DirInfs,lDirStr);
       RecurSearchFile(lDirStr,'*.*',1);
     end;
     if (DirInfs2<>nil) then
     begin
       InstallThds(SearchTds1Active,SearchTds1);
       InstallThds(SearchTds2Active,SearchTds2);
       InstallThds(SearchTds3Active,SearchTds3);
     end
     else
     begin
       BitBtn2.Enabled:=False;
       BitBtn1.Enabled:=True;
       StatusBar1.SimpleText:='  共搜索到 '+inttostr(SearchTotal)+' 个文件';
       ShowMessage('搜索完毕');
     end;
  end
  else
  begin
    BitBtn2.Enabled:=False;
    BitBtn1.Enabled:=True;
    StatusBar1.SimpleText:='  共搜索到 '+inttostr(SearchTotal)+' 个文件';
    ShowMessage('搜索完毕');
  end;
end;

procedure TForm1.SearchFileFound(FileFound: TSearchRec;FilePath: string);
var
  NewItem : TListItem;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -