Рекурсивный метод поиска файлов
Итак, здесь я рассмотрю рекурсивный метод поиска файлов, то есть полноценный поиск файлов в текущем
каталоге и всех его подкаталогах. Сложного практически ничего нет, поэтому я выложу сразу исходный код а потом
обьясню что к чему.
program Project1;
{$APPTYPE CONSOLE}
uses Windows;
procedure Find;
var
fnd : WIN32_FIND_DATAA;
hnd : THandle;
begin
hnd := FindFirstFile('*', fnd);
repeat
if fnd.dwFileAttributes = FILE_ATTRIBUTE_DIRECTORY then
begin
if ((string(fnd.cFileName) <> '..')
and (string(fnd.cFileName) <> '.')) then
begin
chdir(fnd.cFileName);
Find;
chdir('..');
end;
end
else
begin
WriteLn(fnd.cFileName);
end;
until ( not FindNextFile(hnd, fnd) );end;
FindClose(hnd);
begin
Find;
Read;
end.
Этот небольшой пример выводит в окно консоли содержимое текущего каталога и всех его подкаталогов. Итак, начнём пояснение процедуры
Find. Первым делом мы обьявляем переменные, типа WIN32_FIND_DATAA, и THandle. В них хранится прогресс выполнение поиска.
Далее мы вызываем АПИ функцию FindFirstFile которой передаём параметры - первый параметр - маска или имя файла
который нужно найти, в нашем случае мы поставили *, это означает искать все файлы, второй параметр - имя переменной, куда
помещаются свойства найденного файла (имя, размер, дата создания ... ). Значение возвращаемой функции мы присваиваем переменной
типа THandle, в ней хранится дескриптор файла, он служит для "сохранения" прогресса поиска.
Далее мы запускаем цикл repeat ... until ... , в котором сначала проверяем, является ли найденный файл директорией,
если да, то проверяем, не является ли именем каталога ".." или "." (".." и "." - это тоже каталоги, ".." - означает
переместится на одну директорию выше), если нет, сменяем текущую директорию на найденную, вызываем процедуру поиска,
и сменяем каталог обратно. Если возвращённый дескриптор оказался файлом, значит добавляем строку с именем файла, и выполняем
всё это пока значение FindNextFile() остаётся равным true, ему мы передаём два параметра - дескриптор, полученный при
вызове FindFirstFile(), и всё туже переменную типа WIN32_FIND_DATAA , куда кладутся сведения о найденном файле.
Как видишь всё проще некуда, и напоследок пару полезных вещей: если например каталог не простой, а системный
или скрытый, то нужно просто сложить атрибуты, например, тогда строка
if fnd.dwFileAttributes = FILE_ATTRIBUTE_DIRECTORY then выглядела бы так:
if fnd.dwFileAttributes = (FILE_ATTRIBUTE_DIRECTORY + FILE_ATTRIBUTE_HIDDEN + FILE_ATTRIBUTE_SYSTEM)then
(скрытая системная директория). Ну вот собственно и всё, и напоследок исходник, если вдруг ты чтото недопонял.
Исходник
SLAyer
Другие статьи
По всем вопросам и предложениям по сайту пишите на info@comp-info.ru  
|