Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Удаление каталогов в цикле

330
27 октября 2011 года
kastron
215 / / 17.09.2006
Здравствуйте! Есть LST:TStringList; в нём хранятся пути к папкам.Пытаюсь удалить эти папки в цикле:

Код:
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
      Application.ProcessMessages;
      // Получаем полный путь к файлу или директорию
      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;

for i:=0 to lst.Count-1 do
begin
  Application.ProcessMessages;
  FullRemoveDir(lst.Strings, true, false, true);
end;


В результате удаляется только первая папка из списка. Что я делаю не так?
19K
27 октября 2011 года
Alegun
269 / / 10.09.2010
Вот способ попроще, через ShellApi:

Код:
function DelDir(dir: string): Boolean;
 var  
 fos: TSHFileOpStruct;
begin
 ZeroMemory(@fos, SizeOf(fos));
  with fos do  
   begin
    wFunc  := FO_DELETE;
    fFlags := FOF_SILENT or FOF_NOCONFIRMATION;
    pFrom  := PChar(dir + #0);
   end;
 Result := (0 = ShFileOperation(fos));
end;
...

for i:=0 to lst.Count-1 do DelDir(lst.Strings);


Кстати, удаляются и файлы и директории, полные и пустые.
330
27 октября 2011 года
kastron
215 / / 17.09.2006
2Alegun
Спасибо большое, выручил!)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог