如何删除有文件和子目录的目录?
解决方案 »
- 我想每10秒截个全屏,这样监控电脑在操作什么
- 动态修改浏览器中地网页页面具体内容
- delphi 发送邮件时 为什么只能发送163的别的不行?
- 网络通信问题,请各位大虾多多指教,谢谢
- quickreport 里的QRDBText绑定的字段值如果是null或为0就不在QRDBText上不显示任何东西怎么实现
- 如何编辑.RES文件
- 小型数据库下得数据备份恢复问题!很急在线等!
- 关于窗体!难,急,难,急!!!
- 报表问题(只打印第一页)?
- 各位,请问“Multiple records found,but only one was expected",是一个什么故障?
- 血快吐光了,救我.~~~(数据库-qrpreview)
- 打开delphi,提示:应用程序初始化失败????
uses Classes, FileCtrl, SysUtils; procedure RemoveTree(path: string);
procedure RemoveDirectory(path: string);
procedure GetFileList(FileSpec: string;
NamesOnly: Boolean;
var FileList: TStringList);
procedure GetSubDirList(DirRoot: string;
NamesOnly: Boolean;
var SubDirList: TStringList);
function BackSlash(FileSpec: string): string;
function NoBackSlash(FileSpec: string): string; implementation {--------------------------------------------------------}
{这个过程删除整个目录树}
procedure RemoveTree(path: string);
var
SubDirList: TStringList;
FileList: TStringList;
i: integer;
begin
SubDirList := TStringList.Create;
GetSubDirList(path,False,SubDirList);
{如果这个树含有子目录,递归调用删除每一个子目录树}
if SubDirList.Count>0 then
begin
for i := 0 to SubDirList.Count-1 do
begin
RemoveTree(SubDirList[i]);
end;
end;
SubDirList.free;
{到这一步所有的子目录树都已被删除,或者根本不存在。因而你们仅需要删除所有的文件}
FileList := TStringList.Create;
GetFileList(BackSlash(path)+'*.*',False,FileList);
for i := 0 to FileList.Count-1 do
begin
DeleteFile(PChar(FileList[i]));
end;
FileList.Free;
RemoveDirectory(path);
end;
{--------------------------------------------------------}
{这个过程将删除目录(如果它存在)}
procedure RemoveDirectory(path: string);
var
Dir: string;
begin
{删除反斜线(如果它存在)}
Dir := NoBackSlash(path);
if DirectoryExists(Dir) then RmDir(Dir);
end; {--------------------------------------------------------}
{这个过程把所有匹配文件规格的文件名加入一个StringList。如果NamesOnly是true,那么不包含文件路径}
procedure GetFileList(FileSpec: string;
NamesOnly: Boolean;
var FileList: TStringList);
var
SR: TSearchRec;
DosError: integer;
begin
FileList.Clear;
DosError := FindFirst(FileSpec, faAnyFile-faDirectory, SR);
while DosError=0 do
begin
if NamesOnly
then FileList.Add(SR.Name)
else FileList.Add(ExtractFilePath(FileSpec)+SR.Name);
DosError := FindNext(SR);
end;
end; {--------------------------------------------------------}
{这个过程将指定的目录的全部下级目录名加入StringList。如果NamesOnly是true,那么仅仅包括最下级目录名}
procedure GetSubDirList(DirRoot: string;
NamesOnly: Boolean;
var SubDirList: TStringList);
var
SR: TSearchRec;
DosError: integer;
Root: string;
begin
SubDirList.Clear;
{在最后加入一个反斜杠(如果不存在)}
Root := BackSlash(DirRoot);
{使用FindFirst/FindNext返回下级目录}
DosError := FindFirst(Root+'*.*', faDirectory, SR);
while DosError=0 do
begin
{don't include the directories . and ..}
if pos('.',SR.Name)<>1 then
begin
if SR.Attr=faDirectory then
begin
if NamesOnly
then SubDirList.Add(SR.Name)
else SubDirList.Add(Root+SR.Name);
end;
end;
DosError := FindNext(SR);
end;
end; {--------------------------------------------------------}
{添加一个反斜杠(如果它不存在)}
function BackSlash(FileSpec: string): string;
begin
if (FileSpec[length(FileSpec)]<>'\')
then Result := FileSpec+'\'
else Result := FileSpec;
end; {删除一个反斜杠(如果它存在)}
function NoBackSlash(FileSpec: string): string;
begin
if (FileSpec[length(FileSpec)]='\')
then Result := Copy(FileSpec,1,length(FileSpec)-1)
else Result := FileSpec;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
T:TSHFileOpStruct;
P:String;
begin
P:='e:\te';
With T do Begin
Wnd:=0;
wFunc:=FO_DELETE;
pFrom:=Pchar(P);
pTo:=nil;
fFlags:=FOF_ALLOWUNDO+FOF_NOCONFIRMATION+FOF_NOERRORUI
hNameMappings:=nil;
lpszProgressTitle:='正在删除文件夹';
fAnyOperationsAborted:=False;
End;
SHFileOperation(T);
end;
OpStruc:TSHFileOpStruct;
FromBuf:Array[0..128] of Char;
begin
FillChar(FromBuf,Sizeof(FromBuf),0);
StrPCopy(FromBuf,Pchar(Edit1.Text));
//开始填充OpStruc记录
with OpStruc do
begin
Wnd:=Handle;
wFunc:=FO_DELETE;
pFrom:=@FromBuf;
pTo:=nil;
fFlags:=FOF_NOCONFIRMATION;
lpszProgressTitle:='正在删除';
end;
if SHFileOperation(OpStruc)=0 then
//执行成功
MessageBox(Handle,'删除完毕。','删除信息',MB_OK+MB_ICONINFORMATION);
end;