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

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

Как удалить не пустой католог


bAgmAn ©   (2002-12-12 18:14:00) 

Долго думал как бы удалить католог в котором есть папки и файлы. Количество просто огромно а время критично.


oomneeq   (2002-12-12 19:22:00) [1]

как вариант

CreateProcess(nil,"cmd.exe/c rmdir /q/s C:\WINNT",
nil, nil,
false,
CREATE_NO_WINDOW,
nil,
nil,
StartupInfo,
ProcessInfo)

имя каталога подставить по вкусу :)


TCrash   (2002-12-12 19:09:00) [2]

Привожу текст функции. Где взял - не помню но не моя. просьба за копирайт не приставать.


function FullRemoveDir(Dir:string; RemoveRoot:boolean):Boolean;
var i:Integer;
SRec:TSearchRec;
FN:String;
begin
Result:= False;
if Dir = "" then exit;
if not DirectoryExists(Dir) then exit;
Result:= True;
// Добавляем слэш в конце и задаем маску - "все файлы"
Dir:= IncludeTrailingBackslash(Dir) + "*.*";
i:= FindFirst(Dir, faAnyFile, SRec);
while i = 0 do
begin
// Получаем полный путь к файлу или директорию
FN:= ExtractFileDir(Dir)+"\"+SRec.Name;
// Если это директорий
if SRec.Attr = faDirectory then
begin
if (SRec.Name <> "" ) and (SRec.Name <> ".") and (SRec.Name <> "..") then
// Рекурсивный вызов этой же функции с ключом удаления корня
FullRemoveDir(FN,True);
end
else
// Иначе удаляем файл
begin
if SRec.Attr <> faArchive then FileSetAttr(FN, faArchive);
// Если хотя бы один файл не удален - результат отрицательный, но операция продолжается до конца
if not DeleteFile(FN) then Result:= false;
end;
// Берем следующий файл или директорий
i:= FindNext(SRec);
end;
FindClose(SRec);

// Если необходимо удалить корень - удаляем
if RemoveRoot then
try
if not RemoveDir(ExtractFileDir(Dir)) then Result:= false;
except
Result:= false;
end;

end;


Кстати, спасибо автору кода. Работает быстро и корректно. Тестировано на железе :
Cel 600,
392 M,
MB - Abit SE6,
HDD - Maxtor 40G, 7200
Результат : удаление копи папки W2k - 4 сек.
Комментарии излишни - кол-во файлов и папок превышает 5000.


Song   (2002-12-12 18:32:00) [3]

ShFileOperation() или TSearchRec


Наверх

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