Форум: "Основная";
Текущий архив: 2003.04.10;
Скачать: [xml.tar.bz2];
ВнизУдаление каталогов Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.008 c