RemoveDir problem
6 отговора
188 прегледа
RemoveDir problem
Проблемът ми е следния :
Програмно създавам директория записвам някакви файлове в нея след това се опитвам да я изтрия програмно с RemoveDir(като преди това сам изтрил файловете в нея) или с ShFileOperation(без значение е дали има или не файлове) и не мога. При опит с ShFileOperation получавам error 6 Invalid handler.Ако създам DIR изляза от програмата вляза пак тогава нямам проблем с изтриването, ако създам няколко проблема е само с последната създадена май.
Предварително балгодаря за каквато и да е идея какъв би могъл да бъде проблема.
Thanks
Програмно създавам директория записвам някакви файлове в нея след това се опитвам да я изтрия програмно с RemoveDir(като преди това сам изтрил файловете в нея) или с ShFileOperation(без значение е дали има или не файлове) и не мога. При опит с ShFileOperation получавам error 6 Invalid handler.Ако създам DIR изляза от програмата вляза пак тогава нямам проблем с изтриването, ако създам няколко проблема е само с последната създадена май.
Предварително балгодаря за каквато и да е идея какъв би могъл да бъде проблема.
Thanks
Затваряш ли всички файлове от фолдера?
Затваряш ли всички файлове от фолдера?
Може (въпреки, че е изтрит) някой файл да остава отворен.
Или да фолдерът, който се опитваш да триеш да е "текущ" в контекста на приложението.
Май второто е по-вероятно - опитай да провериш и/или смениш текущия фолдер.
Може (въпреки, че е изтрит) някой файл да остава отворен.
Или да фолдерът, който се опитваш да триеш да е "текущ" в контекста на приложението.
Май второто е по-вероятно - опитай да провериш и/или смениш текущия фолдер.
Re: Затваряш ли всички файлове от фолдера?
Пробвах ама не става. смених текущият фолдер на приложението и пак получавам invalid handle както по рано . Ako програмата е активна и се опитам да да изтрия директорията отвън не ми дава като казва че фолдера Is being used by another program ...... Нямам отворени файлове щото като ги трия по стандартния начин Findfirst - findnext нямам проблем с изтриванрто им !
Re: Затваряш ли всички файлове от фолдера?
Ето това съм изтеглил не помня от къде, опитвал съм го, работи безотказно.
Изтрива директориите, независимо дали има в тях файлове или не.
Работи се с
function DirectoryDelete(DelDir:string;Mask:boolean):boolean;
останалите са помощни.
Изтрива директориите, независимо дали има в тях файлове или не.
Работи се с
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;
Re: RemoveDir problem
Може да опиташ и така:
Edit:
Видях, че си използвал "ShFileOperation()", но не си дал сорс за да се види как точно. Нямам време да проверя тава което съм написал дали работи при твоя случай, но се надявам ти да го провериш и да кажеш какво се получава.
За изтриване на директория(може и да НЕ е празна):
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 на
Re: Затваряш ли всички файлове от фолдера?
Виж да не е нещо с правата под 2000/XP. Имал съм подобен проблем при install на програма с админ права и работата й после в ограничен акаунт.
Mixy
Mixy
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;
Предварително благодаря за отделеното време
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;
Предварително благодаря за отделеното време