2013-07-15 3 views
-2

У меня возникли проблемы с написанием кода для процедуры, которая откроет папку каталога и удалит все файлы внутри нее рекурсивно, чтобы я мог, в свою очередь, сам удалить папку. У меня не будет проблем с рекурсивной процедурой, но я не могу заставить функции FindFirst/FindNext/FindClose работать правильно. Процедура, приведенная ниже, должна искать текущий каталог для любых файлов любого типа (однако я могу злоупотреблять строковыми подстановочными знаками, я не нашел много информации о синтаксисе их использования).Как заставить FindFirst искать файлы в текущем каталоге?

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; 

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

+0

Вы пытались быть явным о пути в своем вызове 'FindFirst'? Кроме того, вы знаете, что «текущий» каталог может быть любым, поэтому вы собираетесь навсегда удалить случайный каталог в вашей системе пользователя? –

+0

@AndreasRejbrand - В реальном коде, который я использую, у меня есть текущий каталог, определенный прямо над этим, используя функцию SetCurrentDir, но я опустил это, потому что он довольно длинный и не нужен для моей проблемы. У меня есть текущий каталог, отображаемый в сообщении в начале процедуры, чтобы я мог видеть, в какой директории я работаю. И да, я попытался быть явным. Я даже поместил строку для определенного файла, который я ищу (например, «C: \ Program Files \ Test.txt») –

+0

По-прежнему возможно, что функция API '' FindFirstFile' (http://msdn.microsoft.com/en-us/library/windows/desktop/aa364418(v=vs.85).aspx) не работает, если не задан полностью определенный путь. Может быть, это не заботит текущий рабочий каталог? В любом случае, попробовали ли вы просто заменить '\ *. *' На '*. *'? –

ответ

0

Путь '\*.*' относится к корневому каталогу диска текущего рабочего каталога. Вероятно, вы хотите пройти 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. 
+0

Это все равно не находит никаких файлов. В ответ на ваш другой комментарий я не уверен, какая версия Delphi это, я использую акустическую систему измерения Praxis, которая позволяет вам писать свои собственные сценарии, чтобы сделать программу (в идеале), что бы вы ни хотели это делать. Однако разработчик сценариев использует Delphi, и до сих пор у меня не было никаких проблем с кодированием. И раньше я не использовал IOUtils, я был в предположении, что функция FindFirst находилась под блоком SysUtils? –

+0

Чтобы разработать, функция FileSearch работает для меня успешно, но эта функция будет работать только в том случае, если я ищу конкретный файл.Я ищу процедуру, которая даст мне имя любого файла в указанной папке. –

+0

Разве я не ответил на это? Код в этом ответе содержит список всех объектов в текущем каталоге. –

Смежные вопросы