Как заставить FindFirst искать файлы в текущем каталоге?

У меня проблемы с написанием кода для процедуры, которая откроет папку каталога и рекурсивно удалит все файлы в ней, чтобы я, в свою очередь, мог удалить саму папку. У меня не будет проблем с рекурсивной процедурой, но я не могу заставить функции 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;

Сейчас кажется, что независимо от того, что я вставил в имя файла, процедура никогда не находит никаких файлов и всегда возвращает сообщение "Не найдено ни одного подходящего файла".

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.
Другие вопросы по тегам