【问题标题】:How do I make FindFirst look for files in the current directory?如何让 FindFirst 在当前目录中查找文件?
【发布时间】:2013-07-15 14:05:21
【问题描述】:

我在为将打开目录文件夹并递归删除其中的所有文件以便我可以依次删除文件夹本身的过程编写代码时遇到问题。我不会遇到递归过程的问题,但我似乎无法让 FindFirst/FindNext/FindClose 函数正常工作。下面的过程应该在当前目录中搜索任何类型的任何文件(但是我可能误用了字符串通配符;我在网上没有找到太多关于它们使用语法的信息)。

procedure TForm1.Button1Click(Sender: TObject);
var SR: TSearchRec;
begin
 ShowMessage(GetCurrentDir);
 if (FindFirst('\*.*',faAnyFile,SR)=0) then
 begin
  repeat
   ShowMessage(SR.Name);
  until FindNext(SR)<>0;
  FindClose(SR);
 end
 else begin
  ShowMessage('No matching files found');
 end;
end;

现在看来,无论我输入什么文件名,该过程都找不到任何文件,并且总是返回“未找到匹配文件”消息。

【问题讨论】:

  • 您是否尝试过在调用FindFirst 时明确说明路径?另外,你知道“当前”目录可以是任何东西,所以你要永久删除用户系统上的一个随机目录?
  • @AndreasRejbrand - 在我使用的实际代码中,我使用 SetCurrentDir 函数在其上方定义了当前目录,但我省略了它,因为它很长而且对我的问题没有必要。我在程序开始时的消息中显示了当前目录,以便我可以看到我正在工作的目录。是的,我已经尝试过明确。我什至为我正在寻找的特定文件输入了一个字符串(即'C:\Program Files\Test.txt')
  • 除非给出完全限定的路径,否则FindFirstFile API function 仍然可能不起作用。也许它不关心当前的工作目录?无论如何,您是否尝试过简单地将\*.* 替换为*.*
  • 是的,我尝试了几种不同的字符串通配符迭代,以及拼写特定文件。
  • 但是您的代码中没有其他错误... :( 在一个新的、空的、VCL 或命令行项目中尝试它,并硬编码路径 C:\WINDOWS\*.* (或任何它在您的系统上调用),您会看到它有效。

标签: delphi file-search findfirst


【解决方案1】:

路径'\*.*' 是相对于当前工作目录的驱动器的根目录。您可能的意思是将GetCurrentDir + '\*' 传递给FindFirst。或者更好,TPath.Combine(GetCurrentDir, '*')

例如,如果您将适当的路径传递给FindFirst,则此程序表明您的代码可以正常工作。

program FindFirstDemo;

{$APPTYPE CONSOLE}

uses
  SysUtils, IOUtils;

var
  SR: TSearchRec;

begin
  Writeln(GetCurrentDir);
  if FindFirst(TPath.Combine(GetCurrentDir, '*'),faAnyFile,SR)=0 then
  begin
    repeat
      Writeln(SR.Name);
    until FindNext(SR)<>0;
    FindClose(SR);
  end;
  Readln;
end.

【讨论】:

  • 这仍然没有找到任何文件。作为对您的其他评论的回应,我不确定这是什么版本的 Delphi,我正在使用一个名为 Praxis 的声学测量系统,它允许您编写自己的脚本以使程序(理想情况下)执行您想要的任何操作它要做。然而,脚本设计者使用 Delphi,到目前为止,我在编码方面还没有遇到任何问题。而且我之前没有使用 IOUtils,我假设 FindFirst 函数在 SysUtils 单元下?
  • 详细说明,FileSearch 功能对我来说是成功的,但该功能只有在我搜索特定文件时才有效。我正在寻找一个程序,它会给我指定文件夹中任何文件的名称。
  • 我没有回答吗?此答案中的代码列出了当前目录中的所有对象。
  • 如果我复制此代码并将其粘贴到我的脚本中,我不会得到任何输出返回。所以不知何故它对你有用,但对我不起作用:/
  • 答案中的代码是一个完整的程序。创建一个新的控制台应用程序。将生成的.dpr文件的全部内容替换成这里的代码,就可以得到输出了。
猜你喜欢
  • 2012-12-27
  • 1970-01-01
  • 2014-03-29
  • 1970-01-01
  • 2011-03-10
  • 2011-07-05
相关资源
最近更新 更多