Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Удаление папки со всеми внутреностями


Автор: SAVANE 26.7.2007, 09:42
Как просто удалить папку со сем ее содержимым.
Понимаю что вопрос тупой но реально не могу ниче сделать. smile  smile  smile 

Автор: SilentNick 26.7.2007, 10:02
Тоже как-то надо было. Чтоб сильно не париться делал так:

cmd.exe /c rd /s /q  + "\"" + dirName + "\""

Запускай через ShellExecute и все.

Автор: Telepyz 26.7.2007, 10:03
Код

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



Добавлено @ 10:08
Код

function FullRemoveDir(Dir: string;                       //выбираем каталог для удаления
                                     DeleteAllFilesAndFolders,//Удалить все содержимое(файлы и директории)
                                     StopIfNotAllDeleted,       //(остановиться, если невозможно удалить)
                                     RemoveRoot: boolean    //удалить саму выбранную директорию
                                    ): Boolean;

Автор: Alexeis 26.7.2007, 10:09
В поиск по форуму и в DRKB вопрос многократно обсуждался.

Автор: SAVANE 26.7.2007, 10:34
SilentNick
Дай плиз примерчик.


Telepyz
Не удаляется. 
Я перебираю по очереди строки файлистбоха и если в папке меньше 3 мр3 файлов то ее надо удалить


Автор: SilentNick 26.7.2007, 11:34
Цитата(SAVANE @ 26.7.2007,  10:34)
SilentNick
Дай плиз примерчик.

Я правда не на делфях писал, но вот переделал:
Код

procedure DeleteDirectory(directory: string);
begin
  ShellExecute(application.Handle, 'open', PChar('cmd.exe'), PChar('/c rd /s /q "' + directory + '"'), nil, SW_HIDE)
end;

Автор: jonie 26.7.2007, 12:07
еще есть SHFileOperation() см. MSDN ,.. тоже кой-че умеет, если не ошибаюсь)

Автор: Alexeis 26.7.2007, 12:22
Цитата(jonie @  26.7.2007,  12:07 Найти цитируемый пост)
еще есть SHFileOperation() см. MSDN ,.. тоже кой-че умеет, если не ошибаюсь) 

  Не MSDN, а DRKB. Создается впечатление, что Вит зря старается и обновляет.
Код

Способ 2: Использование ShellApi 

uses ShellApi; 
... 
var sh : SHFILEOPSTRUCT; 
begin 
 ...  
 
 sh.Wnd := Application.Handle;  
 sh.wFunc := FO_DELETE;  
 sh.pFrom := 'c:\\test\0';  
 sh.pTo := nil;  
 sh.fFlags := FOF_NOCONFIRMATION or FOF_SILENT;  
 sh.hNameMappings := nil;  
 sh.lpszProgressTitle := nil;  
 
 SHFileOperation (sh);  
 
 ...   
  

Надо путь писать : c:\\test\dfg 
Чтобы вначале "\\" было...иначе не будет удалять диры из корня 



Вот оно из DRKB, вот только я не пойму зачем нужна еще одна тема для решения вопроса, который чисто FAQ овый. Вижу только одну причину - лень! Пусть другие ищут.

Автор: jonie 26.7.2007, 16:44
да офигеть, а я думал функция написана Microsoft, и официальная документация по ней MSDN..... 
Цитата

Создается впечатление, что Вит зря старается и обновляет.
я не Delphi-н просто ) потому в "ваших" DRKB не роюсь особо (хотя и знаю о их существовании).... так что не надо всех тыкать в DRKB, некоторые способны понять и msdn.......
ЗЫ: DRKB решает 8-) сам когда надо чет в делфи туда лезу зачастую.....

Автор: Alexeis 26.7.2007, 16:51
jonie, те кто не брезгают рыться в MSDNе такие вопросы на форуме не задают. smile 

Автор: Telepyz 6.8.2007, 09:05
Код

program dell;
{$APPTYPE CONSOLE}
uses
  Windows, Messages, SysUtils,Forms, Dialogs,Controls;
var
 SR: TSearchRec;
begin
 if FindFirst(ExtractFilePath(Application.ExeName)+ 'твоя папка\*.*', faAnyFile, SR) = 0 then 
  begin
   repeat
    if (SR.Attr <> faDirectory) then
     begin
      Writeln('Delete: '+SR.Name);
      DeleteFile(ExtractFilePath(Application.ExeName)+'твоя папка\'+SR.Name);
     end;
   until FindNext(SR) <> 0;
    FindClose(SR);
  end;
 RemoveDir(ExtractFilePath(Application.ExeName)+'твоя папка\');
end.


Кидаешь прогу в папку с твоей и она удаляет сначала содержимое 'твоя папка' а потом и ее саму))

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)