delphi,删除文件夹的内容

当我有文件夹中的子文件夹 – 此代码不是删除文件夹…有没有任何错误?

procedure TForm.Remove(Dir: String); var Result: TSearchRec; Found: Boolean; begin Found := False; if FindFirst(Dir + '\*', faAnyFile, Result) = 0 then while not Found do begin if (Result.Attr and faDirectory = faDirectory) AND (Result.Name <> '.') AND (Result.Name <> '..') then Remove(Dir + '\' + Result.Name) else if (Result.Attr and faAnyFile <> faDirectory) then DeleteFile(Dir + '\' + Result.Name); Found := FindNext(Result) <> 0; end; FindClose(Result); RemoveDir(Dir); end; 

Solutions Collecting From Web of "delphi,删除文件夹的内容"

如果我是你,我只是告诉操作系统删除文件夹的所有内容。 这样做通过写( uses ShellAPI

 var ShOp: TSHFileOpStruct; begin ShOp.Wnd := Self.Handle; ShOp.wFunc := FO_DELETE; ShOp.pFrom := PChar('C:\Users\Andreas Rejbrand\Desktop\Test\'#0); ShOp.pTo := nil; ShOp.fFlags := FOF_NO_UI; SHFileOperation(ShOp); 

[如果你这样做

  ShOp.fFlags := 0; 

相反,你会得到一个很好的确认对话框。 如果你这样做

 ShOp.fFlags := FOF_NOCONFIRMATION; 

你没有得到确认对话,但如果操作很长,你会得到一个进度条。 最后,如果添加FOF_ALLOWUNDO标志,则将目录移动到FOF_ALLOWUNDO而不是永久删除它。

 ShOp.fFlags := FOF_ALLOWUNDO; 

当然,你可以结合你喜欢的标志:

 ShOp.fFlags := FOF_NOCONFIRMATION or FOF_ALLOWUNDO; 

将不会显示任何确认(但是因为您没有指定FOF_NO_UI ,所以会显示一个进度对话框),并且该目录将被移动到垃圾箱,而不是永久删除。

最简单的方法就是调用TDirectory.Delete(Dir, True)

TDirectory可以在IOUtils中找到,这是最新的RTL加法。

True标志被传递给Recursive参数,这意味着目录的内容在删除目录之前被占用,这是删除目录的重要部分。


在评论中,你告诉我们你使用的是Delphi 7,所以不能使用。

你的代码看起来很好。 但是,你不是这个意思:

 (Result.Attr and faAnyFile <> faDirectory) 

我认为你的意思是:

 (Result.Attr and faDirectory <> faDirectory) 

我可能会这样写:

 procedure TMyForm.Remove(const Dir: string); var Result: TSearchRec; begin if FindFirst(Dir + '\*', faAnyFile, Result) = 0 then begin Try repeat if (Result.Attr and faDirectory) = faDirectory then begin if (Result.Name <> '.') and (Result.Name <> '..') then Remove(Dir + '\' + Result.Name) end else if not DeleteFile(Dir + '\' + Result.Name) then RaiseLastOSError; until FindNext(Result) <> 0; Finally FindClose(Result); End; end; if not RemoveDir(Dir) then RaiseLastOSError; end; 

上次我需要删除一个包含我使用JCL的内容的文件夹时:

 uses JclFileUtils; DeleteDirectory(DirToDelete, True); 

最后一个参数告诉文件是否应该去回收站,这是一个不错的奖金。

为了解决原来的问题 – 试试这个:

 procedure TForm.Remove(const Dir: String); var sDir: String; Rec: TSearchRec; begin sDir := IncludeTrailingPathDelimiter(Dir); if FindFirst(sDir + '*.*', faAnyFile, Rec) = 0 then try repeat if (Rec.Attr and faDirectory) = faDirectory then begin if (Rec.Name <> '.') and (Rec.Name <> '..') then Remove(sDir + Rec.Name); end else begin DeleteFile(sDir + Rec.Name); end; until FindNext(Rec) <> 0; finally FindClose(Rec); end; RemoveDir(sDir); end; 
 uses DSiWin32; DSiDeleteTree(folderName, false); 

DSiWin32是开放源代码项目,以“随意使用”许可证为重点。