怎样用delphi实现删除一个指定目录下的所有文件和目录?要求: 用API函数.我用递归编了个算法,但怎么都删不了目录,只是把所有文件都删了而已!现在迷惘中,用惯C的我真的很难适应pascal,哪位高手给个具体点的算法我?谢谢!可能用到的API:
mainpath:PCHAR; //mainpath为指定目录
FindFirstFile(PCHAR, _WIN32_FIND_DATA):Cardinal;
FindNextFile(Cardinal, _WIN32_FIND_DATA);
DeleteFile(PCHAR);
RemoveDirectory(PCHAR);
mainpath:PCHAR; //mainpath为指定目录
FindFirstFile(PCHAR, _WIN32_FIND_DATA):Cardinal;
FindNextFile(Cardinal, _WIN32_FIND_DATA);
DeleteFile(PCHAR);
RemoveDirectory(PCHAR);
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; end.
只删除文件,不能删除目录,为什么?
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, FileCtrl, StdCtrls;type
TForm1 = class(TForm)
Button1: TButton;
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;
procedure Button1Click(Sender: TObject);
private
{ Private declarations } public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.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 TForm1.RemoveDirectory(path: string);
var
Dir: string;
begin
{删除反斜线(如果它存在)}
Dir := NoBackSlash(path);
if DirectoryExists(Dir) then RmDir(Dir);
end; {--------------------------------------------------------}
{这个过程把所有匹配文件规格的文件名加入一个StringList。如果NamesOnly是true,那么不包含文件路径}
procedure TForm1.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 TForm1.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 TForm1.BackSlash(FileSpec: string): string;
begin
if (FileSpec[length(FileSpec)]<>'\')
then Result := FileSpec+'\'
else Result := FileSpec;
end; {删除一个反斜杠(如果它存在)}
function TForm1.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);
begin
removetree('d:\test');
end;end.
DDirectory:String; //存放指定目录
OpStruc:TSHFileOpStruct;
FromBuf:Array[0..128] of Char;
begin
DDirectory:='D:\test' ;
if DirectoryExists(DDirectory) then //判断目录是否存在
begin
FillChar(FromBuf,Sizeof(FromBuf),0);//填充结构OpStruc
StrPCopy(FromBuf,Pchar(DDirectory));
with OpStruc do
begin
Wnd:=Handle;
wFunc:=FO_DELETE;
pFrom:=@FromBuf;
pTo:=nil;
fFlags:=FOF_NOCONFIRMATION;
lpszProgressTitle:='';
end;
SHFileOperation(OpStruc);//调用API
end;
fFlags:=FOF_NOCONFIRMATION or FOF_NOERRORUI;