function MyRemoveDir(sDir : string) : Boolean;
var
iIndex: Integer;
SearchRec: TSearchRec;
sFileName: string;
begin
Result := False;
sDir := sDir + '\*.*';
iIndex := FindFirst(sDir, faAnyFile, SearchRec);
while iIndex = 0 dobegin
sFileName := ExtractFileDir(sDir)+'\'+SearchRec.name;
if SearchRec.Attr = faDirectory thenbeginif (SearchRec.name <> '' ) and (SearchRec.name <> '.') and
(SearchRec.name <> '..') then
MyRemoveDir(sFileName);
endelsebeginif SearchRec.Attr <> faArchive then
FileSetAttr(sFileName, faArchive);
ifnot DeleteFile(sFileName) then
ShowMessage('Could NOT delete ' + sFileName);
end;
iIndex := FindNext(SearchRec);
end;
FindClose(SearchRec);
RemoveDir(ExtractFileDir(sDir));
Result := True;
end;
// ***************************** //// Пример: //// ***************************** //ifnot MyRemoveDir('D:\myDir') then
ShowMessage('Can NOT delete dir');
// Кстати, системные, скрытые и// read-only файлы тоже будут удалены.
Приведенный код - функция Delphi под именем MyRemoveDir, которая удаляет целый каталог и все его содержимое. Функция принимает строковый параметр sDir, представляющий путь к каталогу, который нужно удалить.
Вот шаг за шагом, что функция делает:
Она устанавливает булев переменную Result в значение False, которое будет обновлено в True, если удаление было успешным.
Функция конвертирует входной путь к каталогу в поисковый паттерн, добавив к нему \*.*, что соответствует всем файлам и подкаталогам в указанном каталоге.
Затем функция использует рутину FindFirst для поиска первого файла или каталога в указанном каталоге, который соответствует поисковому патерну.
Если найденный элемент - это каталог (то есть его атрибут - faDirectory), функция вызывает себя рекурсивно с путем подкаталога как входным параметром, эффективно удаляя все файлы и подкаталоги в нем.
Если найденный элемент не является каталогом, функция устанавливает его атрибут архива в faArchive, что делает его доступным для удаления (если он был ранее только для чтения). Затем она пытается удалить файл с помощью рутины DeleteFile.
Если удаление не удается, функция отображает сообщение об ошибке, указывающее, что файл не может быть удален.
Функция продолжает поиск и удаление файлов, пока не будет найдено больше совпадений.
После обработки всех элементов в каталоге функция закрывает поисковый.handle с помощью FindClose, удаляет оригинальный каталог с помощью RemoveDir и устанавливает Result в True, указывая, что удаление было успешным.
Пример в конце кода демонстрирует, как использовать эту функцию, удаляя каталог под именем 'myDir', расположенный на диске 'D:' . Если удаление не удается по любому причин, отображается сообщение об ошибке.
В целом, этот код предоставляет robust решение для удаления каталогов и их содержимого, но может не быть подходящим для всех сценариев из-за своей рекурсивной природы и потенциальных проблем с системными файлами, скрытыми файлами или файлами только для чтения.
Альтернативные решения:
Вместо рекурсивного вызова функции вы можете использовать цикл для перебора подкаталогов и файлов в указанном каталоге, используя FindFirst и FindNext для обхода дерева каталогов.
Для безопасного обработки системных файлов, скрытых файлов или файлов только для чтения вы можете рассмотреть использование класса TFile Delphi и его методов для управления атрибутами и правами доступа к файлам.
Данная статья описывает функцию Delphi, которая удаляет каталог с содержимым, рекурсивно обрабатывая все подкаталоги и файлы.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.