Один программист очень любил рекурсию. И когда шеф начинал требовать у него отчет о проделанной работе, он отсылал его к ... себе. И так до переполнения стека у шефа.
{
Здесь я привожу немного сокращенный код, который я создавал для Borland
Pascal 5.5 под DOS (оригинальный код не делал rmDir, поэтому вы можете
поэкспериментировать с этим, передав указатель на каталог функции rmDir
в конце этого кода). Я подозреваю, что Delphi-версия может быть или
идентичной, или иметь некоторые различии в написании имен функций
(рекомендую ознакомиться с электронной документацией по Delphi, с темой,
где описаны функции для работы с файлами). Данный код не предусматривает
проверку атрибутов файлов, которые могут быть установлены для
предотвращения удаления файла. (В Pascal 5.5 вам необходимо между парой
{$I-}{$I+}{поместить функцию, которая вызывает проблему, не знаю,
делаете ли вы это в Delphi.)
}procedure removeTree(DirName: string);
var
FileSearch: SearchRec;
begin{ для начала пробегаемся, и удаляем все файлы }
chDir(DirName);
FindFirst('*.*', Directory, FileSearch);
while (DosError = 0) dobeginif (FileSearch.name <> '.') and (FileSearch.name <> '..') and
((FileSearch.attr and Directory) <> 0) thenbeginif DirName[length(DirName)] = '\' then
removeTree(DirName + FileSearch.Name)
else
removeTree(DirName + '\' + FileSearch.Name);
ChDir(DirName);
end;
FindNext(FileSearch)
end;
{ затем пробегаемся, и удаляем все каталоги }
FindFirst('*.*', AnyFile, FileSearch);
while (DosError = 0) dobeginif (FileSearch.name <> '.') and (FileSearch.name <> '..') then
Remove(workdir);
end;
FindNext(FileSearch)
end;
rmDir(DirName)
end;
Перевод контента на русский язык:
Программа удаления файлов рекурсивно - это классический пример использования рекурсии для обхода деревьев каталогов и удаления файлов и подкаталогов.
Код, предоставленный ниже, написан на Borland Pascal 5.5, но должен быть легко адаптирован в Delphi с некоторыми минорными изменениями.
Вот разбивка кода:
Процедура removeTree принимает имя каталога в качестве входного параметра и рекурсивно обходит дерево каталогов.
Первый цикл использует FindFirst, чтобы найти файлы в текущем каталоге. Если файл не является текущим каталогом (.) или родительским каталогом (..), а его атрибуты указывают, что это регулярный файл (не каталог), то:
Если имя каталога заканчивается символом обратной косой черты (\), процедура вызывает себя рекурсивно для удаления файла.
В противном случае, она добавляет имя файла к имени каталога и вызывает себя рекурсивно.
Второй цикл использует FindFirst снова, чтобы найти каталоги в текущем каталоге. Если каталог не является текущим каталогом (.) или родительским каталогом (..), то:
Она удаляет каталог с помощью процедуры Remove.
Функция rmDir вызывается в конце программы, передавая имя каталога в качестве аргумента.
Некоторые примечания:
Код не проверяет атрибуты файлов, которые могут предотвратить удаление файла. Вам может потребоваться добавление обработки ошибок или изменение кода для обработки таких случаев.
В Delphi вы можете использовать тип TSearchRec вместо SearchRec.
Вы должны быть осторожны при использовании рекурсивных функций, так как они могут привести к переполнению стека, если не будут реализованы правильно.
Чтобы сделать этот код работать в Delphi, вам нужно будет модифицировать его slightly. Вот предложенная версия:
Замечание, что я заменил SearchRec на TSearchRec, и использовал функцию DirectoryExists, чтобы проверить, существует ли каталог перед вызовом рекурсивной процедуры. Я также использовал функцию IncludeTrailingPathDelimiter, чтобы обеспечить правильную форматацию пути каталога.
Рекурсивное удаление файлов и подкаталогов - статья, в которой автор предлагает пример кода на языке Pascal для рекурсивного удаления файлов и каталогов.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.