为什么是这样的,怎样才能完全删除一个目录!!!!!!!!! (200分)

  • 主题发起人 一剑封喉
  • 开始时间

一剑封喉

Unregistered / Unconfirmed
GUEST, unregistred user!
[:(]procedure tfrmMain.deletedir(sysdiryx:string);
Var
T:TSHFileOpStruct;
P:String;
begin
P:=sysdiryx;//这里改成你要删除的任意目录名
With T do
Begin
Wnd:=0;
wFunc:=FO_DELETE;
pFrom:=Pchar(P+#0);
pTo:=#0#0;
fFlags:=FOF_NOCONFIRMATION+FOF_NOERRORUI;//标志表明允许恢复,无须确认并不显示出错信息
hNameMappings:=nil;
// lpszProgressTitle:='正在删除文件夹';
fAnyOperationsAborted:=False;
End;
SHFileOperation(T);
end;
为什么每次删除完,要不就留下目录,要不就什么都没有删除,注意:我的目录下的都是ZIP
文件,请解释帮助
********************8
还有就是怎样将删除时出现的提示框上的取消按钮去掉,因为是在程序中进行,所以不能
被取消删除的,请各位大侠关照
 
应该 fillchar(T, sizeof(T), #0); 先
 
你可试下以下代码:
procedure TForm1.deleteClick(Sender: TObject);
var
OpStruc:TSHFileOpStruct;
FromBuf:Array[0..128] of Char;
begin
FillChar(FromBuf,Sizeof(FromBuf),0);
StrPCopy(FromBuf,Pchar(sysdiryx));//你的目录名
//开始填充OpStruc记录
with OpStruc do
begin
Wnd:=Handle;
wFunc:=FO_DELETE;
pFrom:=@FromBuf;
pTo:=nil;
fFlags:=FOF_NOCONFIRMATION;
end;
if SHFileOperation(OpStruc)=0 then
//执行成功
MessageBox(Handle,'删除完毕。','删除信息',MB_OK+MB_ICONINFORMATION);
end;
 
查过以前的帖子,好象还没有一个满意的答案.
关注
 
With T do 前面加上:FillChar(T, sizeof(T), 0);
 
我写过一个类似的,用了递归的方法,先删除子目录,在删除根目录。
如果目录下有文件,则先删除文件,再删除目录。
这样可以保证全部删除。
 
发过来用用,liudai@21cn.com,
还有一个问题就是用“TSHFileOpStruct”来删除或者拷贝的时候,怎么把那个讨厌的
“取消”按纽去掉,因为是在程序中运行,所以根本就不能取消掉,如果取消掉就很费事了,
所以不知道哪位大侠知道这一点,救火呀
 
procedure DeleteDir(AHandle: THandle; const ADirName: String);
var
SHFileOpStruct: TSHFileOpStruct;
DirName: PChar;
BufferSize: Cardinal;
begin
BufferSize := Length(ADirName) +1 +1;
GetMem(DirName, BufferSize);
try
FillChar(DirName^, BufferSize, 0);
StrCopy(DirName, PChar(ADirName));

with SHFileOpStruct do
begin
Wnd := AHandle;
wFunc := FO_DELETE;
pFrom := DirName;
pTo := nil;
fFlags := FOF_NOCONFIRMATION;

fAnyOperationsAborted := False;
hNameMappings := nil;
lpszProgressTitle := nil;
end;

if SHFileOperation(SHFileOpStruct) <> 0 then
RaiseLastWin32Error;
finally
FreeMem(DirName, BufferSize);
end;
end;
 
function DeleteFileWithUndo(sFileName : string) : boolean;
var
fos : TSHFileOpStruct;
begin
FillChar( fos, SizeOf( fos ), 0 );
with fos do
begin
wFunc := FO_DELETE;
pFrom := PChar( sFileName );
fFlags := FOF_ALLOWUNDO or FOF_NOCONFIRMATION or FOF_SILENT;
end;
Result := ( 0 = ShFileOperation( fos ) );
end;

删除文件或文件夹到回收站,我的程序一直在用,保证无误。
 
参考
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1034784
 
procedure tfrmMain.deletedir(sysdiryx:string);
Var
T:TSHFileOpStruct;
P:String;
begin
P:=sysdiryx;//这里改成你要删除的任意目录名
With T do
Begin
Wnd:=0;
wFunc:=FO_DELETE;
pFrom:=p;
pTo:=nil;
fFlags:=FOF_NOCONFIRMATION or FOF_NOERRORUI;//标志表明允许恢复,无须确认并不显示出错信息

// lpszProgressTitle:='正在删除文件夹';

End;
SHFileOperation(T);
end;
 
文件夹在回收站中
 
procedure TSLForm.CleanFerry(strSrcDir: string);
var
sr : TSearchRec;
iErrno, FAttr : integer;
begin
if strSrcDir[Length(strSrcDir)]<>'/' then
strSrcDir := strSrcDir + '/';
//目录属性
FAttr := faAnyFile xor $8;
//查找所有文件以及目录
if FindFirst(strSrcDir+'*.*', FAttr, sr)=0 then
begin
repeat
//是文件就先删除
if sr.Attr<>faDirectory then
begin
DeleteFile(strSrcDir+sr.Name);
continue;
end;
//特殊的文件目录,不处理
if((sr.Name='.')or(sr. Name='..'))then continue;
//递归删除子目录
CleanFerry(strSrcDir+sr.Name);
until FindNext(sr)<>0;
FindClose(sr);
end;
if strSrcDir<>strFerryPath then
begin
//这里就是删除目录:)
RmDir(strSrcDir);
iErrno := IOResult;
//如果失败了,呵呵
if iErrno <> 0 then
MessageDlg('Cannot remove directory! '+char(13)+'ErrorNo: '+inttostr(iErrno), mtWarning, [mbOk], 0);
end;
end;
 
多人接受答案了。
 
顶部