Почему FindFirst возвращает имена файлов, которые не соответствуют маске?

Я передаю значение параметра '*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;

2 ответа

Решение

Причина в том, что файл имеет "длинное" имя, то есть более 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(), который является основным API для FindFirst состояния:

Поиск включает в себя длинные и короткие имена файлов.

Чтобы обойти эту проблему, вместо использования оболочки Delphi для FindFirstFile() вызовите Win32 API FindFirstFileEx(), Проходить FindExInfoBasic к fInfoLevelId параметр.

У тебя что-то не так.

Я создал папку 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как я и ожидал.

Другие вопросы по тегам