Главная страница
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.013 c
1-30456
denis24
2003-03-26 15:35
2003.04.10
замена символа в textbox


8-30462
Новичек
2003-01-04 13:57
2003.04.10
Можно ли проиграть Wave-файл без применения MediaPlayer?


14-30566
Blacki
2003-03-25 00:20
2003.04.10
Color Text to RTF


14-30597
EthernalWonderer
2003-03-19 17:57
2003.04.10
Нейронные сети


3-30236
Deus
2003-03-16 05:20
2003.04.10
Какой тип БД лучше пользовать?