Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.04.10;
Скачать: CL | DM;

Вниз

Удаление каталогов   Найти похожие ветки 

 
me2   (2003-03-31 17:20) [0]

Столкнулся с такой проблемой - есть StringList в котором находятся пути к различным каталогам. Мне нужно все их удалить. Делаю так
for i := 0 to FilesList.Count - 1 do
DeletedirectoryTree(Application.Handle, FilesList.Strings[i]);
procedure TMainForm.DeleteDirectoryTree(AHandle: THandle; AFromDir: string);
var
SHFileOPStruct: TSHFileOPStruct;
SearchRec: TSearchRec;
begin
if FindFirst(AFromDir, faDirectory, SearchRec) = 0 then
begin
if (SearchRec.Attr and faDirectory) = faDirectory then
begin
with SHFileOPStruct do
begin
Wnd := AHandle;
wFunc := FO_DELETE;
pFrom := PChar(AFromDir);
pTo := nil;
fFlags := FOF_NOCONFIRMATION or FOF_RENAMEONCOLLISION or FOF_SIMPLEPROGRESS;
fAnyOperationsAborted := False;
hNameMappings := nil;
lpszProgressTitle := nil;
end;
SHFileOperation(ShFileOpStruct); //тут выскакивает ошибка
end;
FindClose(SearchRec);
end;
end;


Ошибка следующая - Cannot delete file: Cannot read from the source file or disk
Причем ошибка выскакивает не на первой итерации.


 
Anatoly Podgoretsky ©   (2003-03-31 17:32) [1]

Не понятно зачем смешаны две технологии FindFirst и SHFileOperation, достаточно одной второй.


 
me2   (2003-03-31 17:40) [2]

Просто процедура DeleteDirectoryTree нужна еще в других целях - для удаления потенциально-существующего каталога, т.е если есть -удаляем


 
me2   (2003-03-31 17:42) [3]

Если оставить только вторую технологию, то проблема всеравно не решается


 
Mystic ©   (2003-03-31 17:49) [4]

Попробуй удалять каталоги при помощи функции:

procedure TFileLibrary.DeleteFolder(FolderName: string);
var
SR: TSearchRec;
Len: Integer;
begin
Len := Length(FolderName);
if FolderName[Len] = "\" then FolderName := Copy(FolderName, 1, Len-1);
if FindFirst(FolderName + "\*.*", faAnyFile, SR) = 0 then
begin
repeat
if SR.Name = "." then Continue;
if SR.Name = ".." then Continue;
FileSetAttr(FolderName + "\" + SR.Name, SR.Attr and faDirectory);
if SR.Attr and faDirectory <> 0
then DeleteFolder(FolderName + "\" + SR.Name)
else DeleteFile(FolderName + "\" + SR.Name)
until FindNext(SR) <> 0;
FindClose(SR);
end;
RemoveDir(FolderName);
end;


 
me2   (2003-03-31 17:54) [5]

2 Mystic © (31.03.03 17:49)
Не нужная рекурсия - у меня каталоги по 18 ГБт


 
Mystic ©   (2003-03-31 18:07) [6]

Имхо, она и так и эдак будет... SHFileOperation(ShFileOpStruct); наверняка использует подобный алгоритм удаления... но я бы попробовал, и если тебя результаты не удовлетворябт, то использовать кое-что другое.

Вопрос в том, что ты мешаешь две технологии --- SH-операции и стандартные файловые операции. Можешь просто настроить нужные флаги при вызове обычного удаления каталога и пройтись в цикле без всяких так FindFirst, ...

function TFileLibrary.SHDeleteFolder(FolderName: string): Boolean;
var
SH: TSHFileOpStruct;
begin
FillChar(SH, SizeOf(SH), 0);
SH.wFunc := FO_DELETE;
SH.pFrom := PChar(FolderName + #0);
Result := SHFileOperation(SH) = 0;
if Result then Result := Result and not SH.fAnyOperationsAborted;
end;



Страницы: 1 вся ветка

Текущий архив: 2003.04.10;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.018 c
9-30203
Spose(C)
2002-11-03 14:28
2003.04.10
Тени


3-30251
Yuraz
2003-03-20 10:42
2003.04.10
Мост перекачки данных FoxPro > Oracle с помощью чего организовать


14-30543
типа хакер
2003-03-24 14:54
2003.04.10
Как в exe-ке отключить появление сообщения при запуске?


14-30526
Vlad Oshin
2003-03-24 10:23
2003.04.10
Подсел на WarCraft3 :). У кого какие предпочтения в рассах?


1-30377
Михайлов Антон
2003-03-29 09:51
2003.04.10
MainMenu=>SubMenu