删除一子目录及其下面的文件 The following example demonstrates deleting all the files in a directory and then the directory itself. Additional processing would be required to delete read only files and files that are in use. procedure TForm1.Button1Click(Sender: TObject); var DirInfo: TSearchRec; r : Integer; begin r := FindFirst('C:\Download\Test\*.*', FaAnyfile, DirInfo); while r = 0 do begin if ((DirInfo.Attr and FaDirectory <> FaDirectory) and (DirInfo.Attr and FaVolumeId <> FaVolumeID)) then if DeleteFile(pChar('C:\Download\test\' + DirInfo.Name)) = false then ShowMessage('Unable to delete : C:\Download\test\' + DirInfo.Name); r := FindNext(DirInfo); end; SysUtils.FindClose(DirInfo); if RemoveDirectory('C:\Download\Test') = false then ShowMessage('Unable to delete direcotry : C:\Download\test'); end;
procedure TForm1.Button2Click(Sender: TObject); var sr: TSearchRec; begin if FindFirst('c:\winnt', faAnyFile or faArchive or faVolumeID, sr) = 0 then begin repeat if LowerCase (ExtractFileExt (sr.Name)) = '.txt' then DeleteFile (sr.Name); until FindNext(sr) <> 0; FindClose(sr); 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;
procedure FDeleteTmpFile(AExtName: string); //删除临时文件 var F : TSearchRec; ResultValue : integer; begin ResultValue := FindFirst(FGetTmpPath + '\*.' + AExtName, faAnyFile, F); while ResultValue = 0 do begin if (F.Attr <> faDirectory) and (Pos(AExtName, F.Name) > 0) then DeleteFile(FGetTmpPath + '\' + F.Name); ResultValue := FindNext(F); end; end;
The following example demonstrates deleting all the files in a directory and then the directory itself. Additional processing would be required to delete read only files and files that are in use. procedure TForm1.Button1Click(Sender: TObject);
var
DirInfo: TSearchRec;
r : Integer;
begin
r := FindFirst('C:\Download\Test\*.*', FaAnyfile, DirInfo);
while r = 0 do
begin
if ((DirInfo.Attr and FaDirectory <> FaDirectory) and
(DirInfo.Attr and FaVolumeId <> FaVolumeID)) then
if DeleteFile(pChar('C:\Download\test\' + DirInfo.Name)) = false then
ShowMessage('Unable to delete : C:\Download\test\' + DirInfo.Name);
r := FindNext(DirInfo);
end;
SysUtils.FindClose(DirInfo);
if RemoveDirectory('C:\Download\Test') = false then
ShowMessage('Unable to delete direcotry : C:\Download\test');
end;
var
sr: TSearchRec;
begin
if FindFirst('c:\winnt', faAnyFile or faArchive or faVolumeID, sr) = 0 then
begin
repeat
if LowerCase (ExtractFileExt (sr.Name)) = '.txt' then
DeleteFile (sr.Name);
until FindNext(sr) <> 0;
FindClose(sr);
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;
var
F : TSearchRec;
ResultValue : integer;
begin
ResultValue := FindFirst(FGetTmpPath + '\*.' + AExtName, faAnyFile, F);
while ResultValue = 0 do
begin
if (F.Attr <> faDirectory) and (Pos(AExtName, F.Name) > 0) then
DeleteFile(FGetTmpPath + '\' + F.Name);
ResultValue := FindNext(F);
end;
end;