Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Удаление непустого каталога вместе с подкаталогами

Delphi , Файловая система , Директории



Автор: Lipskiy
WEB-сайт: http://delphibase.endimus.com

{ **** UBPFD *********** by delphibase.endimus.com ****
>> 
Удаление подкаталогов рекурсивное - функция вызывает саму себя.
Описание назначения агрументов:

-DeleteAllFilesAndFolder - если TRUE то функцией будут предприняты
попытки для установки атрибута faArchive любому файлу или папке
перед его(её) удалением;

-StopIfNotAllDeleted - если TRUE то работа функции моментально
прекращается если возникла ошибка удаления хотя бы одного файла или папки;

-RemoveRoot - если TRUE, указывает на необходимость удаления корня.

Зависимости: FileCtrl, SysUtils
Автор:       lipskiy, lipskiy@mail.ru, ICQ:51219290, Санкт-Петербург
Copyright:   Собственное написание (lipskiy)
Дата:        26 апреля 2002 г.
***************************************************** }

function FullRemoveDir(Dir: string; DeleteAllFilesAndFolders,
  StopIfNotAllDeleted, RemoveRoot: boolean): Boolean;
var
  i: Integer;
  SRec: TSearchRec;
  FN: string;
begin
  Result := False;
  if not DirectoryExists(Dir) then
    exit;
  Result := True;
  // Добавляем слэш в конце и задаем маску - "все файлы и директории"
  Dir := IncludeTrailingBackslash(Dir);
  i := FindFirst(Dir + '*', faAnyFile, SRec);
  try
    while i = 0 do
    begin
      // Получаем полный путь к файлу или директорию
      FN := Dir + SRec.Name;
      // Если это директория
      if SRec.Attr = faDirectory then
      begin
        // Рекурсивный вызов этой же функции с ключом удаления корня
        if (SRec.Name <> '') and (SRec.Name <> '.') and (SRec.Name <> '..') then
        begin
          if DeleteAllFilesAndFolders then
            FileSetAttr(FN, faArchive);
          Result := FullRemoveDir(FN, DeleteAllFilesAndFolders,
            StopIfNotAllDeleted, True);
          if not Result and StopIfNotAllDeleted then
            exit;
        end;
      end
      else // Иначе удаляем файл
      begin
        if DeleteAllFilesAndFolders then
          FileSetAttr(FN, faArchive);
        Result := SysUtils.DeleteFile(FN);
        if not Result and StopIfNotAllDeleted then
          exit;
      end;
      // Берем следующий файл или директорию
      i := FindNext(SRec);
    end;
  finally
    SysUtils.FindClose(SRec);
  end;
  if not Result then
    exit;
  if RemoveRoot then // Если необходимо удалить корень - удаляем
    if not RemoveDir(Dir) then
      Result := false;
end;

Пример использования:

FullRemoveDir('C:\a', true, true, true);
// Полное удаление папки C:\a со всем её содержимым,
// и с последующим удалением самой c:\a

Функция Delphi FullRemoveDir рекурсивно удаляет указанный каталог и все его содержимое. Функция принимает четыре параметра: путь к директории для удаления (Dir), три булевых флага (DeleteAllFilesAndFolders, StopIfNotAllDeleted и RemoveRoot).

Следующий анализ функции:

  1. Она проверяет, существует ли указанный каталог с помощью DirectoryExists. Если он не существует, функция завершает свою работу.
  2. Функция устанавливает значение Result в True, чтобы указать, что процесс удаления начался успешно.
  3. Затем функция итерирует по всем файлам и подкаталогам в указанном каталоге с помощью FindFirst и FindNext.
  4. Для каждого файла или подкаталога, найденного:
    • Если это каталог, функция рекурсивно вызывает себя с подкаталогом как новым каталогом для удаления (FullRemoveDir(FN, DeleteAllFilesAndFolders, StopIfNotAllDeleted, True)).
    • Если это не каталог, функция пытается установить атрибут архива для файла с помощью FileSetAttr (если DeleteAllFilesAndFolders равен True) и затем удаляет файл с помощью SysUtils.DeleteFile. Если удаление неудачно, функция устанавливает значение Result в False.
  5. После обработки всех файлов и подкаталогов, если RemoveRoot равно True, функция пытается удалить оригинальный каталог (Dir) с помощью RemoveDir. Если это неудачно, она устанавливает значение Result в False.

Пример использования функции на конце показывает, как вызывать ее с желаемыми параметрами: FullRemoveDir('C:\a', true, true, true). Это рекурсивно удаляет все файлы и подкаталоги в каталоге C:\a, устанавливает атрибут архива для каждого файла и каталога, и затем удаляет оригинальный каталог.

Некоторые предложения по улучшению кода:

  • Вместо рекурсивных вызовов функций, рассмотрите возможность использования цикла для итерации по подкаталогам. Это может помочь избежать потенциальных проблем с переполнением стека.
  • Вы можете добавить более подробное обслуживание ошибок, например, ловить исключения, которые могут возникнуть при удалении файлов или каталогов.
  • Рассмотрите возможность добавления параметра для указания, следует ли удалять содержимое каталога (оставляя каталог сам по себе) или полностью удалить каталог и все его содержимое.

Удаление непустого каталога вместе с подкаталогами и файлами на языке Delphi.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Директории ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-02-19 01:00:17/0.0035319328308105/0