删除Java中的非空目录

时间:2009-02-18 11:37:14

标签: java file-io recursion

假设我有一个表示目录的File f,那么f.delete()只会删除目录,如果它是空的。我在网上找到couple examples使用File.listFiles()File.list()来获取目录中的所有文件,然后递归遍历目录结构并删除所有文件。但是,由于可以创建无限递归的目录结构(在Windows和Linux(带有符号链接)),大概可能用这种风格编写的程序可能永远不会终止。

那么,有没有更好的方法来编写这样的程序,以便它不会陷入这些陷阱?我是否需要跟踪我所经过的所有地方,并确保我不会绕圈或有更好的方式?

更新:回应一些答案(谢谢大家!) - 我宁愿代码没有遵循符号链接并且保留在它应该删除的目录中。即使在Windows情况下,我可以依赖Commons-IO实现吗?

5 个答案:

答案 0 :(得分:32)

如果你真的希望你的递归目录删除遵循符号链接,那么我认为没有任何独立于平台的方法,而不跟踪你所遍历的所有目录。

但是,几乎在每种情况下我都能想到你只想删除指向目录的实际符号链接,而不是递归地跟随符号链接。

如果这是您想要的行为,那么您可以在Apache Commons IO中使用FileUtils.deleteDirectory方法。

答案 1 :(得分:7)

尝试Apache Commons IO进行经过测试的实施。

但是,我不认为这会处理无限递归问题。

答案 2 :(得分:3)

File.getCanonicalPath()将告诉您文件的“真实”名称,包括已解析的符号链接。在扫描时,您会遇到一个您已经知道的目录(因为您将它们存储在Map中)。

答案 3 :(得分:0)

如果你知道哪些文件是符号链接,你可以跳过这些文件。

遗憾的是,在Java中没有检测符号链接的“干净”方式。查看this纯Java解决方法或涉及本机代码的this one

答案 4 :(得分:0)

至少在MacOSX下,删除目录的符号链接不会删除目录本身,因此即使目标目录不为空也可以删除。

我认为这适用于大多数POSIX操作系统。据我所知,Windows下的链接也只是文件,可以从Java程序中删除。