type TFileClass = class private procedure CleanDirectoryProc(sFileName: string; var bContinue: Boolean); end; TEnumDirectoryFileProc = procedure (Filename: string; var bContinue: Boolean) of object; {=============================================================== 功 能: 删除文件或文件夹 参 数: sFileName 文件或文件夹名 返回值: 备 注: 原形 =================================================================} procedure TFileClass.CleanDirectoryProc(sFileName: string; var bContinue: Boolean); var Attr: Integer; begin Attr := FileGetAttr(sFileName); Attr := (not faReadOnly) and Attr; // Turn off ReadOnly attribute Attr := (not faHidden) and Attr; // Turn off Hidden attribute FileSetAttr(sFileName, Attr); if Attr and faDirectory <> 0 then RMDir(sFileName) else SysUtils.DeleteFile(sFileName); end;{===================================================== 功 能: 删除该目录及以下所有文件夹和文件 参 数: sDir 文件夹名称 返回值: 备 注: ======================================================} procedure FileDeleteDirectory(sDir: string); begin //if not MsgYesNoBox('确信要删除该目录及以下所有文件夹和文件吗?') then exit; with TFileClass.Create do try EnumDirectoryFiles(sDir, '*.*', faAnyFile, CleanDirectoryProc); finally Free; end; RMDir(sDir); end;{===================================================== 功 能: 删除该目录及以下所有文件夹和文件 参 数: sDir 文件夹名称 SMASK/过滤文件字符串 Attr 文件属性 EnumDirectoryFileProc 本参数为删除过程 返回值: 备 注: ======================================================} procedure EnumDirectoryFiles(sDir, SMASK: string; Attr: Integer; EnumDirectoryFileProc: TEnumDirectoryFileProc); var SearchRec: TSearchRec; Status : Integer; bContinue: Boolean; begin sDir := PathWithSlash(sDir); // traverse child directories Status := FindFirst(sDir + '*.*', faDirectory, SearchRec); try while Status = 0 do begin if (SearchRec.name <> '.') and (SearchRec.name <> '..') then EnumDirectoryFiles(sDir + SearchRec.name, SMASK, Attr, EnumDirectoryFileProc); Status := FindNext(SearchRec); end; finally SysUtils.FindClose(SearchRec); end; // exam each valid file and invoke the callback func Status := FindFirst(sDir + SMASK, faAnyFile, SearchRec); try while Status = 0 do begin if (SearchRec.Attr and Attr <> 0) and (FileExists(sDir + SearchRec.name) or DirectoryExists(sDir + SearchRec.name)) and not ((SearchRec.Attr and faDirectory <> 0) and ((SearchRec.name = '.') or (SearchRec.name = '..'))) then begin bContinue := True; EnumDirectoryFileProc(sDir + SearchRec.name, bContinue); if not bContinue then Break; end; Status := FindNext(SearchRec); end; finally SysUtils.FindClose(SearchRec); end; end;
TFileClass = class
private
procedure CleanDirectoryProc(sFileName: string; var bContinue: Boolean);
end;
TEnumDirectoryFileProc = procedure (Filename: string; var bContinue: Boolean) of object;
{===============================================================
功 能: 删除文件或文件夹
参 数: sFileName 文件或文件夹名
返回值:
备 注: 原形
=================================================================}
procedure TFileClass.CleanDirectoryProc(sFileName: string; var bContinue: Boolean);
var
Attr: Integer;
begin
Attr := FileGetAttr(sFileName);
Attr := (not faReadOnly) and Attr; // Turn off ReadOnly attribute
Attr := (not faHidden) and Attr; // Turn off Hidden attribute
FileSetAttr(sFileName, Attr); if Attr and faDirectory <> 0 then
RMDir(sFileName)
else
SysUtils.DeleteFile(sFileName);
end;{=====================================================
功 能: 删除该目录及以下所有文件夹和文件
参 数: sDir 文件夹名称
返回值:
备 注:
======================================================}
procedure FileDeleteDirectory(sDir: string);
begin
//if not MsgYesNoBox('确信要删除该目录及以下所有文件夹和文件吗?') then exit;
with TFileClass.Create do
try
EnumDirectoryFiles(sDir, '*.*', faAnyFile, CleanDirectoryProc);
finally
Free;
end;
RMDir(sDir);
end;{=====================================================
功 能: 删除该目录及以下所有文件夹和文件
参 数: sDir 文件夹名称 SMASK/过滤文件字符串
Attr 文件属性 EnumDirectoryFileProc 本参数为删除过程
返回值:
备 注:
======================================================}
procedure EnumDirectoryFiles(sDir, SMASK: string; Attr: Integer; EnumDirectoryFileProc: TEnumDirectoryFileProc);
var
SearchRec: TSearchRec;
Status : Integer;
bContinue: Boolean;
begin
sDir := PathWithSlash(sDir); // traverse child directories
Status := FindFirst(sDir + '*.*', faDirectory, SearchRec);
try
while Status = 0 do
begin
if (SearchRec.name <> '.') and (SearchRec.name <> '..') then
EnumDirectoryFiles(sDir + SearchRec.name, SMASK, Attr, EnumDirectoryFileProc); Status := FindNext(SearchRec);
end;
finally
SysUtils.FindClose(SearchRec);
end; // exam each valid file and invoke the callback func
Status := FindFirst(sDir + SMASK, faAnyFile, SearchRec);
try
while Status = 0 do
begin
if (SearchRec.Attr and Attr <> 0) and (FileExists(sDir + SearchRec.name) or DirectoryExists(sDir + SearchRec.name)) and
not ((SearchRec.Attr and faDirectory <> 0) and ((SearchRec.name = '.') or (SearchRec.name = '..'))) then
begin
bContinue := True;
EnumDirectoryFileProc(sDir + SearchRec.name, bContinue);
if not bContinue then Break;
end; Status := FindNext(SearchRec);
end; finally
SysUtils.FindClose(SearchRec);
end;
end;