RemoveDir problem

6 отговора 188 прегледа
#1

RemoveDir problem

Проблемът ми е следния :
Програмно създавам директория записвам някакви файлове в нея след това се опитвам да я изтрия програмно с RemoveDir(като преди това сам изтрил файловете в нея) или с ShFileOperation(без значение е дали има или не файлове) и не мога. При опит с ShFileOperation получавам error 6 Invalid handler.Ако създам DIR изляза от програмата вляза пак тогава нямам проблем с изтриването, ако създам няколко проблема е само с последната създадена май.

Предварително балгодаря за каквато и да е идея какъв би могъл да бъде проблема.
Thanks

Отговор
в отговор на newbie #2

Затваряш ли всички файлове от фолдера?

Затваряш ли всички файлове от фолдера?
Може (въпреки, че е изтрит) някой файл да остава отворен.
Или да фолдерът, който се опитваш да триеш да е "текущ" в контекста на приложението.
Май второто е по-вероятно - опитай да провериш и/или смениш текущия фолдер.

Отговор
в отговор на NikB #3

Re: Затваряш ли всички файлове от фолдера?

Пробвах ама не става. смених текущият фолдер на приложението и пак получавам invalid handle както по рано . Ako програмата е активна и се опитам да да изтрия директорията отвън не ми дава като казва че фолдера Is being used by another program ...... Нямам отворени файлове щото като ги трия по стандартния начин Findfirst - findnext нямам проблем с изтриванрто им !

Отговор
в отговор на newbie #4

Re: Затваряш ли всички файлове от фолдера?

Ето това съм изтеглил не помня от къде, опитвал съм го, работи безотказно.
Изтрива директориите, независимо дали има в тях файлове или не.
Работи се с
function DirectoryDelete(DelDir:string;Mask:boolean):boolean;
останалите са помощни.

uses ShellAPI;

function AddNullToStr(Path: string): string; //70
begin
if Path = '' then exit;
if Path[Length(Path)] <> #0 then
Result := Path + #0
else
Result := Path;
end; {AddnullToStr}

function DelSlash(Path: string): string;
begin
Result := Path;
if Path <> '' then
if Path[Length(Path)] = '\' then
Delete(Result, Length(Path), 1);
end; {DelSlash}


function DoSHFileOp(Handle: THandle; OpMode: UInt; Src: string;
Dest: string; var Aborted: Boolean;Mask:boolean): Boolean;
var
ipFileOp: TSHFileOpStruct;
begin
Src := AddNullToStr(Src);
Dest := AddNullToStr(Dest);
FillChar(ipFileOp, SizeOf(ipFileOp), 0);
with ipFileOp do
begin
wnd := Handle;
wFunc := OpMode;
pFrom := pChar(Src);
pTo := pChar(Dest);
if Mask then
fFlags := FOF_ALLOWUNDO
else
fFlags := FOF_NOCONFIRMATION;;

fAnyOperationsAborted := Aborted;
hNameMappings := nil;
lpszProgressTitle := '';
end;
Result := SHFileOperation(ipFileOp) = 0;
if ipFileOp.fAnyOperationsAborted = True then
Result := False;
end; {DoSHFileOp}

//Mask = TRUE, задава въпрос дали да трие
function DirectoryDelete(DelDir:string;Mask:boolean):boolean;
var
Aborted:boolean;
begin
Result:=TRUE;
DelDir:=DelSlash(DelDir);
if not DirectoryExists(DelDir) then
begin
if Mask then
ShowMessage(DelDir+'несъществува.');
Exit;
end;
Result:=
DoSHFileOp(
Application.Handle,
FO_DELETE,
DelDir,
'',
Aborted,Mask);
end;


Отговор
в отговор на newbie #5

Re: RemoveDir problem

Може да опиташ и така:


За изтриване на директория(може и да НЕ е празна):

uses
ShellApi;

function DelDir(dir: string): Boolean;
var
fos: TSHFileOpStruct;
begin
ZeroMemory(@fos, SizeOf(fos));
with fos do
begin
wFunc := FO_DELETE;
fFlags := FOF_SILENT or FOF_NOCONFIRMATION;
pFrom := PChar(dir + #0);
end;
Result := (0 = ShFileOperation(fos));
end;


Edit:
Видях, че си използвал "ShFileOperation()", но не си дал сорс за да се види как точно. Нямам време да проверя тава което съм написал дали работи при твоя случай, но се надявам ти да го провериш и да кажеш какво се получава.

Редактирано от SAGE_BS на

Отговор
в отговор на newbie #6

Re: Затваряш ли всички файлове от фолдера?

Виж да не е нещо с правата под 2000/XP. Имал съм подобен проблем при install на програма с админ права и работата й после в ограничен акаунт.

Mixy
Отговор
в отговор на SAGE_BS #7

Re: RemoveDir problem

ето сорца които ползвам

function DeleteFolder(FolderName: string): Boolean;
var
r: TshFileOpStruct;
B: Boolean;
begin
Result := False;
if not DirectoryExists(FolderName) then
Exit;
if FolderName[Length(FolderName)] = ' \ ' then
Delete(FolderName, Length(FolderName), 1);
FillChar(r, SizeOf(r), 0);
r.Wnd:= 0;
r.wFunc := FO_DELETE;
r.pFrom := PChar(FolderName);
r.fFlags := FOF_SILENT or FOF_NOCONFIRMATION;
B:= (ShFileOperation(r) = 0);
if not B then
RaiseLastWin32Error;
Result := B;
end;


ето сорця в които създавам фолдер и добавям файловете в него


if not DirectoryExists(S) then
if not CreateDir(S) then

raise Exception.Create('Не мога да създам директория !!!')

else
begin
S:= S + '\';

CopyTable('Vidove.DB', S);
ProgressShowF.Progress(1);

CopyTable('Dostav.DB', S);
ProgressShowF.Progress(1);

CopyTable('Next.DB', S);

CopyTable('Prev.db', S);
AppendToTable('Prev.DB', S);
ProgressShowF.Complete;
end




procedure CopyTable(Name, WhereTo: String);
var
tbSource,
tbTarget: TTable;
begin
try
tbSource:= TTable.Create(nil);
tbTarget:= TTable.Create(nil);
tbSource.TableName := Location + Name;
tbTarget.TableName := WhereTo + Name;
tbSource.StoreDefs := True;
tbTarget.StoreDefs := True;
tbSource.FieldDefs.Update;
tbSource.IndexDefs.Update;
tbTarget.FieldDefs := tbSource.FieldDefs;
tbTarget.IndexDefs := tbSource.IndexDefs;
tbTarget.CreateTable;
finally
tbSource.Free;
tbTarget.Free;
end;

end;

function AppendToTable(Name, WhereTo: String):Boolean;
var
BatchMove: TBatchMove;
tbSource,
tbTarget: TTable;
begin
try
tbSource:= TTable.Create(nil);
tbTarget:= TTable.Create(nil);
tbSource.TableName := Location + Name;
tbTarget.TableName := WhereTo + Name;
BatchMove:= TBatchMove.Create(nil);
BatchMove.Source:= tbSource;
BatchMove.Destination:= tbTarget;
BatchMove.Mode:= batAppend;
BatchMove.Execute;
finally
Result:= BatchMove.KeyViolCount = 0;
tbSource.Free;
tbTarget.Free;
BatchMove.Free;
end;
end;


Предварително благодаря за отделеното време

Отговор