![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Необходимо очистить директорию [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);
Но я надеюсь, что Вы подскажете более простой способ, чем добавлять эту громоздкую запись