![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Не удаляется каталог функцией SHFileOperation. [D7, WinXP]
V.exeR © (2005-08-08 16:23:00)Ситуация такая: не удается удалить каталог функцией SHFileOperation. Пишет, что каталог используется какой-то программой. Удалять именно через SHFileOperation критично. Каталог абсолютно "левый" - не системный, не с программами, просто тестовый каталог. Единственный ньюанс - я перед этим рекурсивно просматриваю дерево каталогов, в который входит этот "неудаляемый" каталог. Но все FindFirstFile закрыты соответствующими FindClose, а других сложностей не вижу. Код привести сложно, но если приспичит - вырежу, опубликую. Кто-нибудь сталкивался с подобными трудностями? И если кто-нибудь сталкивался, как решали?
P.S. (Не)кстати - общий поиск по сайту не работает, причем довольно давно...
ANB (2005-08-09 11:22:00) [21]
> V.exeR © (09.08.05 10:51) [4]
- нарывался я на схожую проблему. В конце концов сделал через RemoveDirectory и рекурсию. На форуме мастера подсказали, что :
1. В конце имени папки нужно лепить 2 #0.
2. Неплохо бы разделять путь двумя слешами (очень сомневался, но работать стало лучше).
Воспользоваться советами я не успел, так как уже все переписал.
V.exeR (2005-08-09 10:51:00) [22]2 Ботвин Дмитрий: и что скажешь?..
V.exeR (2005-08-09 07:52:00) [23]2 Fav: Возвращает код 32.
Привожу код...
tvLibrary - TTreeView, в нем строится копия дерева каталогов.
Procedure TMainForm.bDelDateClick(Sender: TObject);
Var Temp: String;
SHFileOpStruct : TSHFileOpStruct;
Begin
Temp:=ExcludeTrailingBackslash(ExtractFilePath(GetPath(tvLibrary.Selected)));
If MessageDlg('Вы действительно хотите удалить подкаталог '+tvLibrary.Selected.Text+'?',mtWarning,[mbYes,mbNo],0)=mrYes Then
Begin
ChDir(AppDir);
With SHFileOpStruct Do
begin
Wnd:=Handle;
wFunc:=FO_DELETE;
pFrom:=PChar(Temp);
pTo:=nil;
fFlags:=FOF_ALLOWUNDO;
fAnyOperationsAborted:=False;
hNameMappings:=nil;
lpszProgressTitle:=nil;
end;
IntToStr(SHFileOperation(SHFileOpStruct));
tvLibrary.Items.Clear;
BuildTree(OpenDialog.InitialDir+'\DataBase\',nil);
End;
End;
И BuildTree...
Procedure TMainForm.BuildTree(Path: String; Node: TTreeNode);
Var Found: Integer;
SR: TWin32FindDataA;
kk: Cardinal;
FileName, Temp: String;
NNode: TTreeNode;
Begin
Found:=Windows.FindFirstFile(PChar(Path+'*.*'),SR);
While Found>0 Do
With SR Do
Begin
kk:=0;
FileName:='';
While cFileName[kk]>#0 Do
Begin
FileName:=FileName+cFileName[kk];
Inc(kk);
End;
If (dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY=0) and ((UpperCase(ExtractFileExt(Filename))='.DAT') or (UpperCase(ExtractFileExt(Filename))='.TXT')) Then
Begin
Temp:=ExtractFileName(FileName);
NNode:=tvLibrary.Items.AddChild(Node,Temp);
NNode.SelectedIndex:=9;
NNode.ImageIndex:=9;
NNode.StateIndex:=9;
End Else
If (dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY>0) Then
Begin
If cFileName[0]<>'.' Then
Begin
NNode:=Node;
Node:=tvLibrary.Items.AddChild(NNode,FileName);
If Node.Level=0 Then
Begin
Node.SelectedIndex:=7;
Node.ImageIndex:=7;
Node.StateIndex:=7;
End Else
Begin
Node.SelectedIndex:=8;
Node.ImageIndex:=8;
Node.StateIndex:=8;
End;
BuildTree(Path+FileName+'\',Node);
Node:=NNode;
End;
End;
if not FindNextFile(Found,SR) then Found:=0;
End;
Windows.FindClose(Found);
End;
Fay (2005-08-08 17:05:00) [24]2 V.exeR (08.08.05 16:23)
Что возвращает SHFileOperation?
Ботвин Дмитрий (2005-08-08 17:03:00) [25]Приводи код...