Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Подскажите как удалить папку


Страницы:   1 2 3

lavgirls ©   (2008-07-23 17:21:00) 

Подскажите как удалить папку, програмным путем естественно.


Медвежонок Пятачок   (2008-07-24 11:42:00) [1]

Удалено модератором


Игорь Шевченко   (2008-07-24 11:41:00) [2]

Медвежонок Пятачок ©
Тын-Дын ©
Renegat ©

Для разборок на сайте придуман чат, в крайнем случае конференция "Прочее" по адресу
http://dev2.delphimaster.ru/forum/other/


{RASkov}   (2008-07-24 11:35:00) [3]

> [47] Германн ©   (24.07.08 01:52)
> DelDir <> ClearDir!
> Нафига делать перегрузку, если перегружаемая функция делает
> нечто другое "по сути"?

Да, согласен. Чего-то я тут перемудрил вчера.... да еще в соседней ветке, GLScene попутал с GExperts :( Бывает...


Anatoly Podgoretsky   (2008-07-24 11:32:00) [4]


> Неужели я начал писать хоть немного правильный код?

Прогресс есть.


Denis__   (2008-07-24 10:35:00) [5]


> 1) Нет анализа результата функции FindFirst(). Если поиск
> (вдруг) не начался, то и FindClose() вызывать не следует.
>
> 2) Зачем два цикла поиска? Что, одним нельзя обойтись?
> 3) Функция не удаляет указанную папку. Автор обидется :)
> 3) Если уж критиковать по полной ;) В чем информативность
> дополнительных 4х переменный. Можно, чтобы функция возвращала
> результат, удалось ли удалить содержимое из указанной папки
> или нет. Еще: каждый раз объявлять 4 переменные - замучаешься.
>  Лучше параметры вместо var сделать PInteger и внутри функции
> проверять на Assigned().


1) Да. Не подумал.
2) Зачем-то мне это было нужно %) Не помню, какая тогда была логика. Вроде того, что сначала добраться до конечной папки(в которой нет вложенных) а потом уже начинать удалять файлы.
3)Да там только одну строчку добавить:) и действительно, делал сначала DelFolder, а получилось ClearFolder.
4)Да, у {RASkov} ©  [42] это сделано лучше. Да и переменные это так - блаж была, чтоб статистику выдавать - столько удалено, столько - нет.

И всё?! А обычно сразу такой поток негативной критики. Неужели я начал писать хоть немного правильный код?


Vad   (2008-07-24 06:56:00) [6]

Читаем справку по RxLib

Unit

FileUtil

Declaration

function ClearDir(const Path: string; Delete: Boolean): Boolean;

Description
Функция удаляет все файлы из каталога Path и его подкаталогов. Если параметр Delete имеет значение True, то функция также удаляет сам каталог,
заданный параметром Path и все его подкаталоги. При удалении файлов игнорируется аттрибут Read-Only. При успешном завершении функция возвращает
значение True, в противном случае - False.


Все в этом мире уже когда-то было и новое придумать сложно... )))


Германн   (2008-07-24 01:52:00) [7]


> {RASkov} ©   (23.07.08 23:27) [46]
>
> > [45] Renegat ©   (23.07.08 23:03)
> > Если найду - выложу непременно
>
> Не нужно. No_Dead ругаться будет :) шутка)
>
> ЗЫЖ А я вот на основании
>
> > 3) Функция не удаляет указанную папку. Автор обидется
> :)
>
> добавил дополнительный параметр в первую DelDir(теперь они
> перегруженные)
> Во как:
>  function DelDir(const PathDel: String; IsOnlyClearDir:
> Boolean): TDelDirResult; overload;
>  function DelDir(const PathDel: String): Boolean; overload;
>
> Например, с IsOnlyClearDir=True удобно папку темп чистить
> :))
>
>

DelDir <> ClearDir!
Нафига делать перегрузку, если перегружаемая функция делает нечто другое "по сути"?


{RASkov}   (2008-07-23 23:27:00) [8]

> [45] Renegat ©   (23.07.08 23:03)
> Если найду - выложу непременно

Не нужно. No_Dead ругаться будет :) шутка)

ЗЫЖ А я вот на основании

> 3) Функция не удаляет указанную папку. Автор обидется :)

добавил дополнительный параметр в первую DelDir(теперь они перегруженные)
Во как:
 function DelDir(const PathDel: String; IsOnlyClearDir: Boolean): TDelDirResult; overload;
 function DelDir(const PathDel: String): Boolean; overload;

Например, с IsOnlyClearDir=True удобно папку темп чистить :))

ЗЫЖЖ Эх... пойду-ка я лучше спать)


Renegat   (2008-07-23 23:03:00) [9]

Гы... у меня где-то валялась функция удаления папок через прерывание 21h...
Если найду - выложу непременно, раз уж такая пьянка пошла %)

А вообще - юзайте DELTREE %)


No_Dead   (2008-07-23 23:02:00) [10]

сорри, за оффтоп
вот каков смысл этого всего(ветки на 43+1 поста)?
5 секунд потратил что бы в гугл забить запрос, и 2 сек что бы скопипастить...
вот кто сможет объяснить такое явление как «анти-гугл»?

ЗЫ. не первый раз вижу подобное, и просто дико интересно почему так...


{RASkov}   (2008-07-23 22:45:00) [11]

overload'ы только не нужно... т.е. их нужно убрать :)
Хотел было сделать перегруженную, но параметр один, а результат не является разницей.... в общем ...нужно убрать оверлоад :)


{RASkov}   (2008-07-23 22:43:00) [12]

> [39] Denis__ ©   (23.07.08 20:20)

Гы.... делать было нечего и вот тоже "набросал":
type
 TDelDirResult = record
  DelFilesCount, DelDirsCount,
  NoDelFilesCount, NoDelDirsCount: Integer;
 end;

function DelDir(const PathDel: String): TDelDirResult; overload;
procedure DirDelete(ADir: String; var DDR: TDelDirResult);
var SR: TSearchRec;
begin
  ADir :=IncludeTrailingPathDelimiter(ADir);
  if FindFirst(ADir + '*.*', faAnyFile, SR)=0 then
  try
  repeat
   if (SR.Name = '.') or (SR.Name = '..') then Continue;
   if (SR.Attr and faDirectory = faDirectory) then begin
    DirDelete(ADir + SR.Name, DDR);
   end else
    if DeleteFile(ADir + '\' + SR.Name) then
     Inc(DDR.DelFilesCount) else Inc(DDR.NoDelFilesCount);
  until FindNext(SR) <> 0;
  finally
   FindClose(SR);
   try
    RmDir(ADir);
    Inc(DDR.DelDirsCount);
   except
    Inc(DDR.NoDelDirsCount);
   end;
  end;
end;
begin
 with Result do begin
  DelFilesCount:=0;
  DelDirsCount:=0;
  NoDelFilesCount:=0;
  NoDelDirsCount:=0;
 end;
 DirDelete(PathDel, Result);
end;

function DelDirBool(const PathDel: String): Boolean; overload;
var DDR: TDelDirResult;
begin
 DDR:=DelDir(PathDel);
 Result:=(DDR.NoDelFilesCount=0) and (DDR.NoDelDirsCount=0) and (DDR.DelDirsCount>0);
end;

// Вызов
procedure TForm1.Button1Click(Sender: TObject);
begin
 with DelDir('C:\Temp\123') do
  ShowMessage(Format('Удалено %d файлов, %d - директорий'#13#10'Пропущено: %d - файлов, %d - директорий'
  , [DelFilesCount, DelDirsCount, NoDelFilesCount, NoDelDirsCount]));
 //или
 //if DelDirBool('C:\Temp\123') then ShowMessage('Успех') else ShowMessage('Провал');
end;

:)


Johnmen   (2008-07-23 22:17:00) [13]


> Johnmen ©   (23.07.08 17:53) [10]
> > sniknik ©   (23.07.08 17:50) [9]
> > ...то поможет GetLastError/SysErrorMessage
> > или RaiseLastOSError, Win32Check.
> Ты большой оптимист :)

Большой оптимист в отношении аффтара.


Loginov Dmitry   (2008-07-23 22:07:00) [14]

> покритикуйте код, плиз. Только по теме, что можно улучшить,
> исправить.


1) Нет анализа результата функции FindFirst(). Если поиск (вдруг) не начался, то и FindClose() вызывать не следует.
2) Зачем два цикла поиска? Что, одним нельзя обойтись?
3) Функция не удаляет указанную папку. Автор обидется :)
3) Если уж критиковать по полной ;) В чем информативность дополнительных 4х переменный. Можно, чтобы функция возвращала результат, удалось ли удалить содержимое из указанной папки или нет. Еще: каждый раз объявлять 4 переменные - замучаешься. Лучше параметры вместо varсделать PIntegerи внутри функции проверять на Assigned().


Denis__   (2008-07-23 20:20:00) [15]

procedure DelFolder(sPath : String; var DelFilesCount, DelDirsCount,
   NoDelFilesCount, NoDelDirsCount : Integer);
 procedure DF(path : String; var DFC, DDC, NDFC, NDDC : Integer);
 var
   fr : TSearchRec;
 begin
   FindFirst(path + '\*.*', faAnyFile, fr);
   repeat
     if (fr.Name <> '.') AND (fr.Name <> '..') AND
       (fr.Attr AND faDirectory = faDirectory) then
     begin
       DF(path + '\' + fr.Name, DFC, DDC, NDFC, NDDC);
       try
         RmDir(path + '\' +fr.Name);
         Inc(DDC);
       except
         Inc(NDDC)
       end;
     end;
   until FindNext(fr) <> 0;
   FindClose(fr);

   FindFirst(path + '\*.*', faAnyFile, fr);
   repeat
     if (fr.Name <> '.') AND (fr.Name <> '..')
       AND (fr.Attr AND faDirectory <> faDirectory) then
     begin
       if DeleteFile(path + '\' + fr.Name) then
         Inc(DFC)
       else
         Inc(NDFC);
     end;
   until FindNext(fr) <> 0;
   FindClose(fr);
 end;
begin
 DelFilesCount := 0;
 DelDirsCount := 0;
 NoDelFilesCount := 0;
 NoDelDirsCount := 0;
 DF(sPath, DelFilesCount, DelDirsCount, NoDelFilesCount, NoDelDirsCount);
end;

Мастера, покритикуйте код, плиз. Только по теме, что можно улучшить, исправить.


Тын-Дын   (2008-07-23 20:13:00) [16]

Удалено модератором


Anatoly Podgoretsky   (2008-07-23 19:09:00) [17]

Удалено модератором


Amoeba   (2008-07-23 19:01:00) [18]

Автору вопроса сюда (о SHFileOperation):
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=91


Тын-Дын   (2008-07-23 18:56:00) [19]

Удалено модератором


Anatoly Podgoretsky   (2008-07-23 18:55:00) [20]

Удалено модератором


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо