能否给点思路?
8 个解决方案
#1
//删除目录下的某种类型的文件,支持通配符
Function DeleteFileOneType(ADirctory:string;
AFileName:string;
ASubDirectory:Boolean):boolean;
var
lpFileOp: TSHFileOpStruct;
FromDir:PChar;
ToDir:PChar;
f:TSearchRec;
begin
if AsubDirectory then//包括子目录
begin
GetMem(FromDir, Length(ADirctory+'\'+AFileName)+2);
GetMem(ToDir, Length(ADirctory)+2);
Try
FillChar(FromDir^, Length(ADirctory+'\'+AFileName)+2, 0);
FillChar(ToDir^, Length(ADirctory)+2, 0);
StrCopy(FromDir, PChar(ADirctory+'\'+AFileName));
StrCopy(ToDir, PChar(ADirctory));
lpFileop.wFunc:=FO_DELETE;
lpFileop.Wnd:=Application.Handle;
lpFileop.pFrom:=FromDir;
lpFileop.pTo:=ToDir;
lpFileop.fFlags:=FOF_NOCONFIRMMKDIR or FOF_NOCONFIRMATION or FOF_FILESONLY or FOF_NOERRORUI;
lpFileop.fAnyOperationsAborted := False;
lpFileop.hNameMappings := nil;
lpFileop.lpszProgressTitle := nil;
Result:=SHFileOperation(lpFileop)=0;
Finally
FreeMem(ToDir,Length(ADirctory)+2);
FreeMem(FromDir,Length(ADirctory+'\'+AFileName)+2);
end;
end
else //不包括子目录
begin
Result:=false;
if FindFirst(ADirctory+'\'+AFileName,$0000003F,f)=0 then
begin
Result:=DeleteFile(ADirctory+'\'+f.Name);
while FindNext(f) = 0 do
DeleteFile(ADirctory+'\'+f.Name);
FindClose(f);
end;
end;
end;
Function DeleteFileOneType(ADirctory:string;
AFileName:string;
ASubDirectory:Boolean):boolean;
var
lpFileOp: TSHFileOpStruct;
FromDir:PChar;
ToDir:PChar;
f:TSearchRec;
begin
if AsubDirectory then//包括子目录
begin
GetMem(FromDir, Length(ADirctory+'\'+AFileName)+2);
GetMem(ToDir, Length(ADirctory)+2);
Try
FillChar(FromDir^, Length(ADirctory+'\'+AFileName)+2, 0);
FillChar(ToDir^, Length(ADirctory)+2, 0);
StrCopy(FromDir, PChar(ADirctory+'\'+AFileName));
StrCopy(ToDir, PChar(ADirctory));
lpFileop.wFunc:=FO_DELETE;
lpFileop.Wnd:=Application.Handle;
lpFileop.pFrom:=FromDir;
lpFileop.pTo:=ToDir;
lpFileop.fFlags:=FOF_NOCONFIRMMKDIR or FOF_NOCONFIRMATION or FOF_FILESONLY or FOF_NOERRORUI;
lpFileop.fAnyOperationsAborted := False;
lpFileop.hNameMappings := nil;
lpFileop.lpszProgressTitle := nil;
Result:=SHFileOperation(lpFileop)=0;
Finally
FreeMem(ToDir,Length(ADirctory)+2);
FreeMem(FromDir,Length(ADirctory+'\'+AFileName)+2);
end;
end
else //不包括子目录
begin
Result:=false;
if FindFirst(ADirctory+'\'+AFileName,$0000003F,f)=0 then
begin
Result:=DeleteFile(ADirctory+'\'+f.Name);
while FindNext(f) = 0 do
DeleteFile(ADirctory+'\'+f.Name);
FindClose(f);
end;
end;
end;
#2
使用递归
qq:35735257
function Deltree(path:string):boolean;
var
searchRec:TSearchRec;
OldDir:string;
begin
if DirectoryExists(Path) then
begin
OldDir:=GetCurrentDir;
ChDir(Path);
//查找目录中所有文件
FindFirst('*.*',faAnyfile,SearchRec);
repeat
FileSetAttr(SearchRec.Name,0);
//如果不是目录,则第归调用DelTree
if (SearChRec.Attr and faDirectory>0) then
begin
if (SearcRec.Name[1]<>'.') then
if (not DelTree(SearchRec.Name) then
break;
end
else//如果是文件则直接删除
if (not deleteFile(SearchRec.name)) then
break;
until (FindNext(SearchREC)<>0);
chdir('..');//回到父目录,删除该目录.
result:=RemoveDir(Olddir)
end
else
result:=false;
end;
qq:35735257
function Deltree(path:string):boolean;
var
searchRec:TSearchRec;
OldDir:string;
begin
if DirectoryExists(Path) then
begin
OldDir:=GetCurrentDir;
ChDir(Path);
//查找目录中所有文件
FindFirst('*.*',faAnyfile,SearchRec);
repeat
FileSetAttr(SearchRec.Name,0);
//如果不是目录,则第归调用DelTree
if (SearChRec.Attr and faDirectory>0) then
begin
if (SearcRec.Name[1]<>'.') then
if (not DelTree(SearchRec.Name) then
break;
end
else//如果是文件则直接删除
if (not deleteFile(SearchRec.name)) then
break;
until (FindNext(SearchREC)<>0);
chdir('..');//回到父目录,删除该目录.
result:=RemoveDir(Olddir)
end
else
result:=false;
end;
#3
好象当子目录里有文件时不能删除目录,只能删除文件,
必须判断是否有子目录,有则删除其下文件。这样子目录才能删除。
要递归的。
必须判断是否有子目录,有则删除其下文件。这样子目录才能删除。
要递归的。
#4
呵呵。
to jackystar(我)
我的方法可删除任何的目录,包括文件和子目录和子目录下的文件,在其中可以给出任何提示。
to jackystar(我)
我的方法可删除任何的目录,包括文件和子目录和子目录下的文件,在其中可以给出任何提示。
#5
谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!
#6
Rainsea(飞龙在天) 我那个只是我以前系统中用到的,懒得改了
#7
to:Rainsea(飞龙在天)
你的函数还是有问题的,不信你自己试试:建一个空目录,里面放两个新建txt,再放一个空文件夹,调用函数后只删除了新建txt1。:)
================================================================
CSDN 论坛助手 Ver 1.0 B0402提供下载。 改进了很多,功能完备!
★ 浏览帖子速度极快![建议系统使用ie5.5以上]。 ★ 多种帖子实现界面。
★ 保存帖子到本地[html格式]★ 监视您关注帖子的回复更新。
★ 可以直接发贴、回复帖子★ 采用XML接口,可以一次性显示4页帖子,同时支持自定义每次显示帖子数量。可以浏览历史记录!
★ 支持在线检测程序升级情况,可及时获得程序更新的信息。
★★ 签名 ●
可以在您的每个帖子的后面自动加上一个自己设计的签名哟。
Http://www.ChinaOK.net/csdn/csdn.zip
Http://www.ChinaOK.net/csdn/csdn.rar
Http://www.ChinaOK.net/csdn/csdn.exe [自解压]
你的函数还是有问题的,不信你自己试试:建一个空目录,里面放两个新建txt,再放一个空文件夹,调用函数后只删除了新建txt1。:)
================================================================
CSDN 论坛助手 Ver 1.0 B0402提供下载。 改进了很多,功能完备!
★ 浏览帖子速度极快![建议系统使用ie5.5以上]。 ★ 多种帖子实现界面。
★ 保存帖子到本地[html格式]★ 监视您关注帖子的回复更新。
★ 可以直接发贴、回复帖子★ 采用XML接口,可以一次性显示4页帖子,同时支持自定义每次显示帖子数量。可以浏览历史记录!
★ 支持在线检测程序升级情况,可及时获得程序更新的信息。
★★ 签名 ●
可以在您的每个帖子的后面自动加上一个自己设计的签名哟。
Http://www.ChinaOK.net/csdn/csdn.zip
Http://www.ChinaOK.net/csdn/csdn.rar
Http://www.ChinaOK.net/csdn/csdn.exe [自解压]
#8
各位,我只是提供思路而已,具体的还没有进行测试,
肯定有错误,但思路肯定没有问题。
那是即兴写的。呵呵
肯定有错误,但思路肯定没有问题。
那是即兴写的。呵呵
#1
//删除目录下的某种类型的文件,支持通配符
Function DeleteFileOneType(ADirctory:string;
AFileName:string;
ASubDirectory:Boolean):boolean;
var
lpFileOp: TSHFileOpStruct;
FromDir:PChar;
ToDir:PChar;
f:TSearchRec;
begin
if AsubDirectory then//包括子目录
begin
GetMem(FromDir, Length(ADirctory+'\'+AFileName)+2);
GetMem(ToDir, Length(ADirctory)+2);
Try
FillChar(FromDir^, Length(ADirctory+'\'+AFileName)+2, 0);
FillChar(ToDir^, Length(ADirctory)+2, 0);
StrCopy(FromDir, PChar(ADirctory+'\'+AFileName));
StrCopy(ToDir, PChar(ADirctory));
lpFileop.wFunc:=FO_DELETE;
lpFileop.Wnd:=Application.Handle;
lpFileop.pFrom:=FromDir;
lpFileop.pTo:=ToDir;
lpFileop.fFlags:=FOF_NOCONFIRMMKDIR or FOF_NOCONFIRMATION or FOF_FILESONLY or FOF_NOERRORUI;
lpFileop.fAnyOperationsAborted := False;
lpFileop.hNameMappings := nil;
lpFileop.lpszProgressTitle := nil;
Result:=SHFileOperation(lpFileop)=0;
Finally
FreeMem(ToDir,Length(ADirctory)+2);
FreeMem(FromDir,Length(ADirctory+'\'+AFileName)+2);
end;
end
else //不包括子目录
begin
Result:=false;
if FindFirst(ADirctory+'\'+AFileName,$0000003F,f)=0 then
begin
Result:=DeleteFile(ADirctory+'\'+f.Name);
while FindNext(f) = 0 do
DeleteFile(ADirctory+'\'+f.Name);
FindClose(f);
end;
end;
end;
Function DeleteFileOneType(ADirctory:string;
AFileName:string;
ASubDirectory:Boolean):boolean;
var
lpFileOp: TSHFileOpStruct;
FromDir:PChar;
ToDir:PChar;
f:TSearchRec;
begin
if AsubDirectory then//包括子目录
begin
GetMem(FromDir, Length(ADirctory+'\'+AFileName)+2);
GetMem(ToDir, Length(ADirctory)+2);
Try
FillChar(FromDir^, Length(ADirctory+'\'+AFileName)+2, 0);
FillChar(ToDir^, Length(ADirctory)+2, 0);
StrCopy(FromDir, PChar(ADirctory+'\'+AFileName));
StrCopy(ToDir, PChar(ADirctory));
lpFileop.wFunc:=FO_DELETE;
lpFileop.Wnd:=Application.Handle;
lpFileop.pFrom:=FromDir;
lpFileop.pTo:=ToDir;
lpFileop.fFlags:=FOF_NOCONFIRMMKDIR or FOF_NOCONFIRMATION or FOF_FILESONLY or FOF_NOERRORUI;
lpFileop.fAnyOperationsAborted := False;
lpFileop.hNameMappings := nil;
lpFileop.lpszProgressTitle := nil;
Result:=SHFileOperation(lpFileop)=0;
Finally
FreeMem(ToDir,Length(ADirctory)+2);
FreeMem(FromDir,Length(ADirctory+'\'+AFileName)+2);
end;
end
else //不包括子目录
begin
Result:=false;
if FindFirst(ADirctory+'\'+AFileName,$0000003F,f)=0 then
begin
Result:=DeleteFile(ADirctory+'\'+f.Name);
while FindNext(f) = 0 do
DeleteFile(ADirctory+'\'+f.Name);
FindClose(f);
end;
end;
end;
#2
使用递归
qq:35735257
function Deltree(path:string):boolean;
var
searchRec:TSearchRec;
OldDir:string;
begin
if DirectoryExists(Path) then
begin
OldDir:=GetCurrentDir;
ChDir(Path);
//查找目录中所有文件
FindFirst('*.*',faAnyfile,SearchRec);
repeat
FileSetAttr(SearchRec.Name,0);
//如果不是目录,则第归调用DelTree
if (SearChRec.Attr and faDirectory>0) then
begin
if (SearcRec.Name[1]<>'.') then
if (not DelTree(SearchRec.Name) then
break;
end
else//如果是文件则直接删除
if (not deleteFile(SearchRec.name)) then
break;
until (FindNext(SearchREC)<>0);
chdir('..');//回到父目录,删除该目录.
result:=RemoveDir(Olddir)
end
else
result:=false;
end;
qq:35735257
function Deltree(path:string):boolean;
var
searchRec:TSearchRec;
OldDir:string;
begin
if DirectoryExists(Path) then
begin
OldDir:=GetCurrentDir;
ChDir(Path);
//查找目录中所有文件
FindFirst('*.*',faAnyfile,SearchRec);
repeat
FileSetAttr(SearchRec.Name,0);
//如果不是目录,则第归调用DelTree
if (SearChRec.Attr and faDirectory>0) then
begin
if (SearcRec.Name[1]<>'.') then
if (not DelTree(SearchRec.Name) then
break;
end
else//如果是文件则直接删除
if (not deleteFile(SearchRec.name)) then
break;
until (FindNext(SearchREC)<>0);
chdir('..');//回到父目录,删除该目录.
result:=RemoveDir(Olddir)
end
else
result:=false;
end;
#3
好象当子目录里有文件时不能删除目录,只能删除文件,
必须判断是否有子目录,有则删除其下文件。这样子目录才能删除。
要递归的。
必须判断是否有子目录,有则删除其下文件。这样子目录才能删除。
要递归的。
#4
呵呵。
to jackystar(我)
我的方法可删除任何的目录,包括文件和子目录和子目录下的文件,在其中可以给出任何提示。
to jackystar(我)
我的方法可删除任何的目录,包括文件和子目录和子目录下的文件,在其中可以给出任何提示。
#5
谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!
#6
Rainsea(飞龙在天) 我那个只是我以前系统中用到的,懒得改了
#7
to:Rainsea(飞龙在天)
你的函数还是有问题的,不信你自己试试:建一个空目录,里面放两个新建txt,再放一个空文件夹,调用函数后只删除了新建txt1。:)
================================================================
CSDN 论坛助手 Ver 1.0 B0402提供下载。 改进了很多,功能完备!
★ 浏览帖子速度极快![建议系统使用ie5.5以上]。 ★ 多种帖子实现界面。
★ 保存帖子到本地[html格式]★ 监视您关注帖子的回复更新。
★ 可以直接发贴、回复帖子★ 采用XML接口,可以一次性显示4页帖子,同时支持自定义每次显示帖子数量。可以浏览历史记录!
★ 支持在线检测程序升级情况,可及时获得程序更新的信息。
★★ 签名 ●
可以在您的每个帖子的后面自动加上一个自己设计的签名哟。
Http://www.ChinaOK.net/csdn/csdn.zip
Http://www.ChinaOK.net/csdn/csdn.rar
Http://www.ChinaOK.net/csdn/csdn.exe [自解压]
你的函数还是有问题的,不信你自己试试:建一个空目录,里面放两个新建txt,再放一个空文件夹,调用函数后只删除了新建txt1。:)
================================================================
CSDN 论坛助手 Ver 1.0 B0402提供下载。 改进了很多,功能完备!
★ 浏览帖子速度极快![建议系统使用ie5.5以上]。 ★ 多种帖子实现界面。
★ 保存帖子到本地[html格式]★ 监视您关注帖子的回复更新。
★ 可以直接发贴、回复帖子★ 采用XML接口,可以一次性显示4页帖子,同时支持自定义每次显示帖子数量。可以浏览历史记录!
★ 支持在线检测程序升级情况,可及时获得程序更新的信息。
★★ 签名 ●
可以在您的每个帖子的后面自动加上一个自己设计的签名哟。
Http://www.ChinaOK.net/csdn/csdn.zip
Http://www.ChinaOK.net/csdn/csdn.rar
Http://www.ChinaOK.net/csdn/csdn.exe [自解压]
#8
各位,我只是提供思路而已,具体的还没有进行测试,
肯定有错误,但思路肯定没有问题。
那是即兴写的。呵呵
肯定有错误,但思路肯定没有问题。
那是即兴写的。呵呵