function DeleteDir(Dir: string): boolean;
var
Found: integer;
SearchRec: TSearchRec;
begin
result := false;
if IOResult <> 0 then
ChDir(Dir);
if IOResult <> 0 thenbegin
ShowMessage('Не могу войти в каталог: ' + Dir);
exit;
end;
Found := FindFirst('*.*', faAnyFile, SearchRec);
while Found = 0 dobeginif (SearchRec.name <> '.') and (SearchRec.name <> '..') thenif (SearchRec.Attr and faDirectory) <> 0 thenbeginifnot DeleteDir(SearchRec.name) then
exit;
endelseifnot DeleteFile(SearchRec.name) thenbegin
ShowMessage('Не могу удалить файл: ' + SearchRec.name);
exit;
end;
Found := FindNext(SearchRec);
end;
FindClose(SearchRec);
ChDir('..');
RmDir(Dir);
result := IOResult = 0;
end;
Перевод контента на русский язык:
Функция Delphi, именуемая DeleteDir, удаляет целый каталог и все его содержимое. Вот разбивка кода:
Подпись функции
Функция принимает параметр stringDir, представляющий путь к каталогу, который нужно удалить.
Инициализация
Функция инициализирует переменную result значением false, которая будет использоваться для указания успешности или неуспешности удаления.
Смена текущего каталога
Функция использует процедуру ChDir для смены текущего каталога на указанный Dir. Если это fails (т.е., IOResult <> 0), она отображает сообщение об ошибке и выходит из функции.
Найти файлы и подкаталоги
Функция использует процедуру FindFirst для поиска всех файлов и подкаталогов в текущем каталоге. Паттерн поиска - "*.*" (который соответствует любому имени файла), атрибут файла установлен на faAnyFile, а переменная SearchRec инициализируется результатами.
Удаление файлов и подкаталогов
Функция использует цикл while для прохода по найденным файлам и подкаталогам. Для каждого элемента она проверяет, не является ли это текущим каталогом (.) или родительским каталогом (..). Если это подкаталог, функция вызывает себя рекурсивно для удаления его содержимого. Если это файл, функция использует процедуру DeleteFile для удаления его. Если любая из этих операций fails, она отображает сообщение об ошибке и выходит из функции.
Удаление текущего каталога
После удаления всех файлов и подкаталогов функция использует процедуру RmDir для удаления самого каталога. Наконец, она устанавливает переменную result в значение успешности или неуспешности этой операции (т.е., IOResult = 0).
Альтернативное решение
Хотя этот код работает, есть некоторые проблемы с ним:
1. Он не обрабатывает ошибки правильно. Если любая из операций удаления fails, она отображает сообщение об ошибке и выходит из функции.
2. Он не предоставляет способ отмены операции удаления.
Вот альтернативное реализация, которая решает эти проблемы:
В этом реализации мы используем блок try-finally для обеспечения вызова процедуры FindClose, даже если возникает ошибка при поиске. Мы также используем блок try-except для ловли ошибок, возникающих при удалении файлов и каталогов. Наконец, мы устанавливаем переменную result в значение успешности или неуспешности всей операции (т.е., IOResult = 0).
Функция DeleteDir удаляет каталог со всем содержимым, включая подкаталоги и файлы, а также выводит сообщения о неудачных операциях удаления.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.