Delphi 文件搜索和openword文档算法

Delphi 文件搜索和openword文档算法,delphi,delphi-7,file-search,findfirst,Delphi,Delphi 7,File Search,Findfirst,使用教程中的代码并进行各种修改,我得到了一个递归过程的工作代码,该过程搜索具有文件名的文件,该文件名是用户在给定路径上输入的,当通过按钮单击从另一个过程传递参数时,会通过子文件夹进行搜索。 详情如下: procedure TfrmProject.btnOpenDocumentClick(Sender: TObject); begin FileSearch('C:\Users\Guest\Documents', edtDocument.Text+'.docx'); end; procedure

使用教程中的代码并进行各种修改,我得到了一个递归过程的工作代码,该过程搜索具有文件名的文件,该文件名是用户在给定路径上输入的,当通过按钮单击从另一个过程传递参数时,会通过子文件夹进行搜索。 详情如下:

procedure TfrmProject.btnOpenDocumentClick(Sender: TObject);
begin
FileSearch('C:\Users\Guest\Documents', edtDocument.Text+'.docx');
end;

procedure TfrmProject.FileSearch(const Pathname, FileName : string);
var Word : Variant;
    Rec  : TSearchRec;
    Path : string;
begin
Path := IncludeTrailingBackslash(Pathname);
if FindFirst(Path + FileName, faAnyFile - faDirectory, Rec) = 0
then repeat Word:=CreateOLEObject('Word.Application');
  Word.Visible:=True;
  Word.Documents.Open(Path + FileName);
   until FindNext(Rec) <> 0;
FindClose(Rec);


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, FileName);
  until FindNext(Rec) <> 0;
 finally
 FindClose(Rec);
end;

end; //procedure FileSearch
过程TfrmProject.btnopendiumentclick(发送方:TObject);
开始
文件搜索('C:\Users\Guest\Documents',edtDocument.Text+'.docx');
结束;
过程TfrmProject.FileSearch(const路径名,文件名:string);
变量词:变体;
Rec:TSearchRec;
路径:字符串;
开始
路径:=includeTrailingBackslax(路径名);
如果FindFirst(路径+文件名,faAnyFile-faDirectory,Rec)=0
然后重复单词:=CreateOLEObject('Word.Application');
可见:=真;
Word.Documents.Open(路径+文件名);
直到FindNext(Rec)0;
FindClose(Rec);
如果FindFirst(路径+'*.*',faDirectory,Rec)=0,则
尝试
重复
如果((Rec.Attr和faDirectory)0)和(Rec.Name'.'和(Rec.Name'.'),则
文件搜索(路径+记录名、文件名);
直到FindNext(Rec)0;
最后
FindClose(Rec);
结束;
结束//程序文件搜索
在尝试了解发生了什么之后,直到第一次FindClose(Rec)之前,我已经获得了很好的理解,但是这段代码我仍然不确定:

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, FileName);
      until FindNext(Rec) <> 0;
     finally
     FindClose(Rec);
    end;
    end;
如果FindFirst(路径+'*.*',faDirectory,Rec)=0,则
尝试
重复
如果((Rec.Attr和faDirectory)0)和(Rec.Name'.'和(Rec.Name'.'),则
文件搜索(路径+记录名、文件名);
直到FindNext(Rec)0;
最后
FindClose(Rec);
结束;
结束;
我猜第一行是检查给定路径中是否有子文件夹,但我不太确定其余部分,以及它是如何工作的,如果这是正确的。
非常感谢您的帮助。

您说得对,第二块代码使用
*.
搜索模式在给定路径中查找子文件夹(idk为什么有这样的掩码)。然后它跳过当前文件夹(
)和父文件夹
。然后,它在找到的子目录中对
*.docx
文件运行递归搜索。您可以删除
if
-语句中的
rec.attr和faDirectory
,因为它在
FindFirst
-call中使用。信不信由你,FindFirst调用中使用的faDirectory attAttribute实际上并没有将结果限制在目录中,因此仍然需要在if语句中进行检查。你不明白哪一部分?请说得更具体些。Stack Overflow并不是一个“阅读我的想法”的网站,你的所有问题都可以在一篇文章中得到解答。问一个关于你不理解的代码部分的具体问题。如果有很多部分你不懂,那么你可以问几个问题;或者,无论任务是什么,这都不是您应该使用的代码。好的,这一行特别是如果((Rec.Attr和faDirectory)0)和(Rec.Name'.')和(Rec.Name'.'),然后是文件搜索(Path+Rec.Name,FileName);除了罗布说的以外。。。您知道您正在创建Word的多个实例,方法是将
CreateOLEObject
放入循环中,然后通过每次重复使用变量将它们孤立在内存中,对吗?(您可以通过在包含多个Word文档的文件夹中运行应用程序来确认这一点,以便打开多个Word文档,然后退出应用程序并关闭Word。查看任务管理器的“流程”选项卡,您将看到Word.exe的多个副本挂起。)