各位朋友,Delphi函数如下:该函数可以将每个目录(包含子目录)下的所有文件删除,但不能将每个目录删除,不知错在哪里,希望朋友们能指出,多谢!
function TForm1.DoRemoveDir(sDirName: string): Boolean;
var
hFindFile: Cardinal;
tfile: string;
sCurDir: string;
bEmptyDir: Boolean;
FindFileData: WIN32_FIND_DATA;
begin
//如果删除的是空目录,则置bEmptyDir为True
//初始时,bEmptyDir为True
bEmptyDir := True;
//先保存当前目录
sCurDir := GetCurrentDir;
SetLength(sCurDir, Length(sCurDir));
ChDir(sDirName);
hFindFile := FindFirstFile('*.*', FindFileData);
if hFindFile <> INVALID_HANDLE_VALUE then
begin
repeat
tfile := FindFileData.cFileName;
if (tfile = '.') or (tfile = '..') then
begin
bEmptyDir := bEmptyDir and True;
Continue;
end;
//不是空目录,置bEmptyDir为False
bEmptyDir := False;
if FindFileData.dwFileAttributes = FILE_ATTRIBUTE_DIRECTORY then
begin
if sDirName[Length(sDirName)] <> '\' then
DoRemoveDir(sDirName + '\' + tfile)
else
DoRemoveDir(sDirName + tfile);
if not RemoveDirectory(PChar(tfile)) then
result := false
else
result := true;
end
else
begin
if not DeleteFile(PChar(tfile)) then
result := false
else
result := true;
end;
until FindNextFile(hFindFile, FindFileData) = false;
// FindClose(hFindFile);
end
else
begin
ChDir(sCurDir);
result := false;
exit;
end;
//如果是空目录,则删除该空目录
if bEmptyDir then
begin
//返回上一级目录
ChDir('..');
//删除空目录
RemoveDirectory(PChar(sDirName));
end;
//回到原来的目录下
ChDir(sCurDir);
result := true;
end;
function TForm1.DoRemoveDir(sDirName: string): Boolean;
var
hFindFile: Cardinal;
tfile: string;
sCurDir: string;
bEmptyDir: Boolean;
FindFileData: WIN32_FIND_DATA;
begin
//如果删除的是空目录,则置bEmptyDir为True
//初始时,bEmptyDir为True
bEmptyDir := True;
//先保存当前目录
sCurDir := GetCurrentDir;
SetLength(sCurDir, Length(sCurDir));
ChDir(sDirName);
hFindFile := FindFirstFile('*.*', FindFileData);
if hFindFile <> INVALID_HANDLE_VALUE then
begin
repeat
tfile := FindFileData.cFileName;
if (tfile = '.') or (tfile = '..') then
begin
bEmptyDir := bEmptyDir and True;
Continue;
end;
//不是空目录,置bEmptyDir为False
bEmptyDir := False;
if FindFileData.dwFileAttributes = FILE_ATTRIBUTE_DIRECTORY then
begin
if sDirName[Length(sDirName)] <> '\' then
DoRemoveDir(sDirName + '\' + tfile)
else
DoRemoveDir(sDirName + tfile);
if not RemoveDirectory(PChar(tfile)) then
result := false
else
result := true;
end
else
begin
if not DeleteFile(PChar(tfile)) then
result := false
else
result := true;
end;
until FindNextFile(hFindFile, FindFileData) = false;
// FindClose(hFindFile);
end
else
begin
ChDir(sCurDir);
result := false;
exit;
end;
//如果是空目录,则删除该空目录
if bEmptyDir then
begin
//返回上一级目录
ChDir('..');
//删除空目录
RemoveDirectory(PChar(sDirName));
end;
//回到原来的目录下
ChDir(sCurDir);
result := true;
end;
function TForm1.DoRemoveDir(sDirName: string): Boolean;
var
OpStruc:TSHFileOpStruct;
FromBuf:Array[0..128] of Char;
begin
FillChar(FromBuf,Sizeof(FromBuf),0);
StrPCopy(FromBuf,Pchar(sDirName));
//开始填充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;
var
DirInfo : TSearchRec;
i : Integer;
tmp : string;
begin
i := FindFirst(DirName + '\*.*', faAnyFile ,DirInfo);
while i = 0 do
begin
if DirInfo.Attr and favolumeid = 0 then
begin
tmp := dirname + '\' + DirInfo.Name;
if DirInfo.Attr and fadirectory = 0 then DeleteFile(PChar(tmp))
else
if (dirinfo.name <> '..') and (DirInfo.Name <> '.') then Deletedir(tmp);
i := findnext(DirInfo);
end;
end;
RemoveDir(Dirname);
SysUtils.FindClose(DirInfo);
end;
procedure TForm1.DeleteDir(DirName: string);
var
DirInfo: TSearchRec;
i: Integer;
tmp: string;
begin
i := FindFirst(DirName + '\*.*', faAnyFile, DirInfo);
while i = 0 do//问题1:这句话的意思,是不是说“当找到文件的时候就。”
begin
if DirInfo.Attr and favolumeid = 0 then//问题2:DirInfo.Attr and favolumeid = 0这句是啥意思?
begin
tmp := dirname + '\' + DirInfo.Name;
if DirInfo.Attr and fadirectory = 0 then DeleteFile(PChar(tmp))//问题3:DirInfo.Attr and fadirectory = 0是啥意思?
else
if (dirinfo.name <> '..') and (DirInfo.Name <> '.') then Deletedir(tmp);
i := findnext(DirInfo);
end;
end;
FindClose(DirInfo);
RemoveDir(Dirname);
end;
//问题4:为什么要(dirinfo.name <> '..') and (DirInfo.Name <> '.') then
//问题5: if (dirinfo.name <> '..') and (DirInfo.Name <> '.') then Deletedir(tmp);整句又是啥啥意思,始终不是很明白,如何递归调用这个删除的过程的?它的执行过程能否再形象一点呢?
findfirst
FindFirst returns 0 if a file was successfully located, otherwise, it returns an error code.findnext
the return value is zero if the function was successful. Otherwise the return value is an error code.问题一:是的,找到任何文件或文件夹
问题二:不是盘符(如: c:\)
问题三:不是文件夹(这时删除文件)
问题四:..上层目录,.本目录(如果不加这个判断的话,执行一下,要删除的目录外面的东西都删掉了)
问题五:是文件夹,且文件夹不是‘..’‘.’,递归首先路径下找文件或文件夹,是文件则删除,是目录则递归,找下一个,最后删除空文件夹。
你的要求可以使用这个函数
function TForm1.DoRemoveDir(sDirName: string): Boolean;
var
OpStruc:TSHFileOpStruct;
FromBuf:Array[0..128] of Char;
begin
FillChar(FromBuf,Sizeof(FromBuf),0);
StrPCopy(FromBuf,Pchar(sDirName));
//开始填充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;
以上有楼主也讲了