Поиск файла во всех директориях рекурсивно - Turbo Pascal
Формулировка задачи:
программа выполняет поиск по сигнатуре. НО! делает это в одной папке. а как сделать так, чтобы поиск был и во вложенных в эту папку папках?
Решение задачи: «Поиск файла во всех директориях рекурсивно»
textual
Листинг программы
Uses DOS; Procedure FileFind(Dir,FindName : PathStr); {Поиск файлов по маске по всему диску} Procedure SearchDir(Dir : PathStr); Var SRec : SearchRec; begin {Поиск файлов по маске} if Dir[Length(Dir)] <> '\' then Dir := Dir+'\'; FindFirst(Dir + FindName, AnyFile, SRec); While DosError = 0 do begin With SRec do if Attr and (VolumeID + Directory) = 0 then WriteLn(Dir + Name); FindNext(SRec); end; {Поиск всех вложенных каталогов, в т.ч. скрытых, системных, r/o} FindFirst(Dir+'*.*', Directory or ReadOnly or Hidden or SysFile, SRec); While DosError = 0 do begin With SRec do if (Attr and Directory <> 0) and (Name[1] <> '.') then SearchDir(Dir+Name); FindNext(SRec); end; end; begin SearchDir(Dir); end; {------------------------------------------} {Пример поиска всех .TXT файлов на диске С:} begin FileFind('c:\','*.txt'); end.
Объяснение кода листинга программы
- Подключается библиотека DOS.
- Определяется процедура
FileFind
, которая выполняет поиск файлов по маске по всему диску. - Определяется процедура
SearchDir
, которая рекурсивно ищет все файлы по заданной маске в текущей директории и всех ее поддиректориях. - В процедуре
SearchDir
инициализируется переменнаяSRec
, которая будет использоваться для хранения информации о найденных файлах. - Если последний символ директории не является обратным слэшем (
\
), то к нему добавляется обратный слэш (\
). - Вызывается функция
FindFirst
с аргументамиDir + FindName
,AnyFile
иSRec
. Эта функция ищет первый файл, соответствующий заданной маске, в указанной директории. - Пока ошибка DOS равна нулю, выполняется цикл. Внутри цикла выводится имя найденного файла.
- После каждого вывода имени файла вызывается функция
FindNext
с переменнойSRec
. - Если атрибут файла
VolumeID + Directory
равен нулю, то его имя выводится на экран. - Вызывается функция
FindFirst
с аргументамиDir + '*.*'
,Directory or ReadOnly or Hidden or SysFile
иSRec
. Эта функция ищет все файлы, соответствующие заданной маске, в указанной директории. - Пока ошибка DOS равна нулю, выполняется цикл. Внутри цикла вызывается процедура
SearchDir
с аргументомDir + Name
. Эта процедура ищет все файлы с именем, совпадающим с указанным, в указанной директории. - Если атрибут файла
Directory
не равен нулю и его имя не начинается с точки (.'
), то вызывается процедураSearchDir
с аргументомDir + Name
. - Выполняются действия, описанные в пунктах 6-11.
- Конец процедуры
SearchDir
. - Конец программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д