Текущий архив: 2007.03.25;
Скачать: CL | DM;
Вниз
Необходимо очистить директорию Найти похожие ветки
← →
Roman_S © (2007-03-03 10:05) [0]Необходимо очистить директорию. Ниже представлен замечательный код, который «выметает» буквально всё :-) … Всё, кроме подкаталогов. Как модернизировать данный код для получения желаемого результата?
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 10:10) [1]Можно, конечно:
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);
Но я надеюсь, что Вы подскажете более простой способ, чем добавлять эту громоздкую запись
← →
Virgo_Style © (2007-03-03 10:19) [2]чем не устраивает SHFileOperation?
← →
Roman_S © (2007-03-03 11:11) [3]чем не устраивает SHFileOperation?
Переделывать? Мне кажется - это последнее, что можно будет сделать!
Хотелось бы разобраться - что не так?
← →
ЮЮ © (2007-03-03 11:43) [4]if (StrComp(SR.cFileName,".")<>0)and(StrComp(SR.cFileName,"..")<>0) then begin
DeleteDirTree(FullName);
RemoveDir(FullName);
end;
← →
Virgo_Style © (2007-03-03 11:44) [5]В первом варианте не обрабатываются подкаталоги (даже если их нет, то каталог все равно не удаляется) , во втором варианте - не обрабатываются файлы и не очень ясно - отдельная ли это процедура, или это (не дай Тьма) дополнение для процедуры в [0].
А в целом, рекурсивный вызов при обнаружении каталога - наиболее простое решение.
Переделывать? Мне кажется - это последнее, что можно будет сделать!
Иногда переделать - это первое, что надо сделать; иногда даже до того, как начинать что-либо делать :-)))
← →
ЮЮ © (2007-03-03 11:50) [6]
> В первом варианте не обрабатываются подкаталоги
Не вдавался в подробности, но зачем тогда рекурсивный вызов DeleteDirTree?
← →
Virgo_Style © (2007-03-03 12:05) [7]ЮЮ © (03.03.07 11:50) [6]
Нет. Это я не вдавался в подробности)) действительно, файлы удаляются, не удаляются только сами подкаталоги.
← →
Roman_S © (2007-03-03 13:37) [8]ЮЮ © (03.03.07 11:43) [4]
- Спасибо, супер!
Единственное, как учесть:
Roman_S © (03.03.07 10:05)
Очищаемая директория НЕ удаляется!
← →
Roman_S © (2007-03-03 14:40) [9]Попробовал так:
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 19:24) [10]Прошу прощения - разобрался!
Страницы: 1 вся ветка
Текущий архив: 2007.03.25;
Скачать: CL | DM;
Память: 0.47 MB
Время: 0.029 c