如何一次性删除一个目录下所有文件?(20分)

  • 主题发起人 主题发起人 pp-yy-xx
  • 开始时间 开始时间
procedure TForm1.Button1Click(Sender: TObject);
var
myrec:TSHFILEOPSTRUCT
begin
With myrec DO Begin
Wnd:= Handle;
wFunc:= FO_DELETE;
pFrom:= 'c:/tmp/*.*';
pTo:='';
fFlags:= FOF_NOCONFIRMATION or FOF_FILESONLY;
fAnyOperationsAborted:= False;
hNameMappings:= Nil;
lpszProgressTitle:= Nil;
end;
SHFileOperation(myrec);
end;
注:在uses单元添加shellapi(调试环境:d5+winme)
 
hhzh426的做法不对,应调用第归:
function Tform1.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;
 
to softprince:
您验证了吗?我可是调试通过才贴上去的(我的程序里有一个不足:当有文件不能删除时
将中途退出,且会出现一个提示框)
你的删除方法我也用过,但是你的程序中好象有一个错误,<>'.'好象应该改成<>'.' or <>'..'
 
{删除指定文件和目录}
function Deltree(S:string):Boolean;
var
F:TSearchRec;
Path,Wildcard:string;
IsDir,Find:Boolean;
begin
if ExtractFileName(S)='' then //S是根目录或为空字符串
begin
Result:=False;
Exit;
end;
Result:=True;
Find:=False;
IsDir:=DirectoryExists(S);
if IsDir then
begin
Path:=ExpandFileName(S)+'/';
Wildcard:=Path+'*.*';
end
else
begin
Path:=ExtractFilePath(S);
Wildcard:=S;
end;
if FindFirst(Wildcard,faAnyFile,F)=0 then
begin
Find:=True;
while True do
begin
if not ((F.Name='.') or (F.Name='..')) then
begin
if (F.Attr and faDirectory)>0 then
begin
if Deltree(Path+F.Name)=False then
Result:=False;
end
else
if DeleteFile(Path+F.Name)=False then
Result:=False;
end;
if FindNext(F)<>0 then
Break;
end;
FindClose(F);
end;
if IsDir then
begin
if Result=True then
Result:=RemoveDir(S);
end
else
if not Find then
Result:=False;
end;
{删除指定文件和目录}
 
to hhzh426:
我按照你的方法,有时会出现删除文件错误的信息,为什么会这样?我要删除的文件
是存在且是普通的属性的文件!
 
to pp-yy-xx:
用我的方法删除其实就象你在资源管理器中删除文件和目录是一样,它们调用的是同一个接
口,这种情况下如果你删除的文件中有被系统保护(不允许删除)或者正在被使用的文件时就
会中断执行,与文件属性无关!
如果你想在发生错误时忽略的话就要用softprince的方法了!
 
to hhzh426:
softprince是如何使用?请指教!
 
回复pp-yy-xx:
代码如上.
以上代码实现对一个目录,可以删除其中的所有子目录和文件及空目录.使用第归.
对于特殊文件(只读,系统,隐藏)则先用
FileSetAttr函数修改属性.
//注解如下:
function Tform1.Deltree(path:string):boolean;
var
searchRec:TSearchRec;
OldDir:string;
begin
if DirectoryExists(Path) then //判断Path目录是否存在
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]<>'.') or (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;
 
说白了就是递归查找文件的问题,我自己写了一个函数,可惜不再身边
 
用FindFirst、FindNext找文件,删了就行了
 
接受答案了.
 
后退
顶部