Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
3-30253
RDA
2003-03-19 20:54
2003.04.10
Access - XP или 2000


3-30299
Doom
2003-03-20 08:19
2003.04.10
Добавление объекта OLE в MS ACCESS


7-30632
@Ujin
2003-02-14 23:35
2003.04.10
И опять про печать...


4-30647
Pakshin A. S.
2003-02-11 11:53
2003.04.10
Очистка корзины...


14-30555
Marser
2003-03-24 16:33
2003.04.10
Графитовая бомба





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский