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

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

Необходимо очистить директорию [D7]


Roman_S ©   (2007-03-03 10:05:00) 

Необходимо очистить директорию. Ниже представлен замечательный код, который «выметает» буквально всё :-) … Всё, кроме подкаталогов. Как модернизировать данный код для получения желаемого результата?
procedure DeleteDirTree(const Dir:string);
var
 SR:TWin32FindData;
 SH:THandle;
 FullName:string;
begin
 SH:=FindFirstFile(PChar(IncludeTrailingBackSlash(Dir)+'*'),SR);
 if SH<>INVALID_HANDLE_VALUE then try
   repeat
     FullName:=Dir+'\'+SR.cFileName;
     if SR.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY=0 then begin
       if SR.dwFileAttributes and(FILE_ATTRIBUTE_HIDDEN or FILE_ATTRIBUTE_SYSTEM or FILE_ATTRIBUTE_READONLY)<>0 then
         SetFileAttributes(PChar(FullName),FILE_ATTRIBUTE_NORMAL);
       DeleteFile(PChar(FullName));
     end
     else
       if (StrComp(SR.cFileName,'.')<>0)and(StrComp(SR.cFileName,'..')<>0) then DeleteDirTree(FullName);
   until not FindNextFile(SH,SR);
 finally
   Windows.FindClose(SH);
 end;
end;

Очищаемая директория НЕ удаляется!


Roman_S   (2007-03-03 19:24:00) [1]

Прошу прощения - разобрался!


Roman_S   (2007-03-03 14:40:00) [2]

Попробовал так:
if (StrComp(SR.cFileName,'.')<>0)and(StrComp(SR.cFileName,'..')<>0) then begin
DeleteDirTree(FullName);
if StrComp(SR.cFileName,'..')<>0 then RemoveDir(FullName);
end;

и так:
if (StrComp(SR.cFileName,'.')<>0)and(StrComp(SR.cFileName,'..')<>0) then begin
DeleteDirTree(FullName);
if StrComp(SR.cFileName,'.')<>0 then RemoveDir(FullName);
end;

Удаляется и очищаемый каталог :'-(


Roman_S   (2007-03-03 13:37:00) [3]

ЮЮ ©   (03.03.07 11:43) [4]

- Спасибо, супер!
Единственное, как учесть:
Roman_S ©   (03.03.07 10:05)
Очищаемая директория НЕ удаляется!


Virgo_Style   (2007-03-03 12:05:00) [4]

ЮЮ ©   (03.03.07 11:50) [6]
Нет. Это яне вдавался в подробности)) действительно, файлы удаляются, не удаляются только сами подкаталоги.


ЮЮ   (2007-03-03 11:50:00) [5]


> В первом варианте не обрабатываются подкаталоги

Не вдавался в подробности, но зачем тогда рекурсивный вызов DeleteDirTree?


Virgo_Style   (2007-03-03 11:44:00) [6]

В первом варианте не обрабатываются подкаталоги (даже если их нет, то каталог все равно не удаляется) , во втором варианте - не обрабатываются файлы и не очень ясно - отдельная ли это процедура, или это (не дай Тьма) дополнение для процедуры в [0].

А в целом, рекурсивный вызов при обнаружении каталога - наиболее простое решение.

Переделывать? Мне кажется - это последнее, что можно будет сделать!
Иногда переделать - это первое, что надо сделать; иногда даже до того, как начинать что-либо делать :-)))


ЮЮ   (2007-03-03 11:43:00) [7]

if (StrComp(SR.cFileName,'.')<>0)and(StrComp(SR.cFileName,'..')<>0) then begin
 DeleteDirTree(FullName);
  RemoveDir(FullName);
end;


Roman_S   (2007-03-03 11:11:00) [8]

чем не устраивает SHFileOperation?
Переделывать? Мне кажется - это последнее, что можно будет сделать!

Хотелось бы разобраться - что не так?


Virgo_Style   (2007-03-03 10:19:00) [9]

чем не устраивает SHFileOperation?


Roman_S   (2007-03-03 10:10:00) [10]

Можно, конечно:
iIndex := FindFirst(sDir, faAnyFile, SearchRec);
while iIndex = 0 do begin
sFileName := ExtractFileDir(sDir)+'\'+SearchRec.Name;
if SearchRec.Attr = faDirectory then begin
if (SearchRec.Name <> '' ) and (SearchRec.Name <> '.') and
(SearchRec.Name <> '..') then MyRemoveDir(sFileName);
iIndex := FindNext(SearchRec);
end;
end;
FindClose(SearchRec);

Но я надеюсь, что Вы подскажете более простой способ, чем добавлять эту громоздкую запись


Наверх

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