17

我将参数值传递 '*1.dat'给 FindFirst,仍然是 FindFirst() 例程返回的第一个文件46checks5.dat,非常一致。

这是一个已知问题吗?

vpath:=trim(vpath);
result:=true;
try
  res:=findfirst(vpath+'\'+vmask,faarchive,search);    //vmask = *1.dat
  try 
    while res=0 do
    begin
      vlist.add(search.name);   //searchname returned is 46checks5.dat!!!
      res:=findnext(search);
    end;
  finally
    findclose(search);
  end;
except
  result:=false;
end;
4

2 回答 2

25

原因是该文件有一个“长”的名称,即超过 8 个字符。对于此类文件,Windows 还创建“短”名称,通常以格式创建,longna~1.dat并且通过*1.dat通配符找到该短名称。

您可以在空目录中的命令提示符下轻松重现相同的行为:

C:\TEMP>回声。> 46checks5.dat
C:\TEMP>dir /x *1.dat
 驱动器 C 中的卷没有标签。
 卷序列号为 5C09-D9DE

 C:\TEMP 目录

2011.04.15 21:37 3 46CHEC~1.DAT 46checks5.dat
               1 个文件 3 个字节

的文档FindFirstFile(),它是FindFirst状态的底层 API:

搜索包括长文件名和短文件名。

FindFirstFile()要解决此问题,请调用 Win32 API ,而不是使用 Delphi 的包装器FindFirstFileEx()。传递FindExInfoBasicfInfoLevelId参数。

于 2011-04-15T18:46:37.987 回答
0

你还有别的问题。

我创建了一个文件夹C:\Temp\Test,并在其中放入了三个文件:

TestFile1.txt
TestFile2.txt
TestFile3.txt

然后我TMemo在一个新项目中的一个新的空白表单上放置了一个,并将此代码添加到“FormCreate”事件中:

procedure TForm1.FormCreate(Sender: TObject);
var
  sPath: string;
  sFile: string;
  SR: TSearchRec;
begin
  sPath := 'C:\Temp\Test';
  sFile := '*1.txt';

  Memo1.Lines.Clear;
  if FindFirst(sPath + '\' + sFile, faArchive, SR) = 0 then
  begin
    try
      repeat
        Memo1.Lines.Add(SR.Name);
      until FindNext(SR) <> 0;
    finally
      FindClose(SR);
    end;
  end;
end;

显示表单时,正如我所期望的那样,只TMemo显示了一个文件。TestFile1.txt

于 2011-04-15T16:50:59.200 回答