File.listFiles()并区分物理文件夹和虚拟文件夹

时间:2010-07-01 13:30:22

标签: java windows file-io directory

File.listFiles()方法列出文件夹的内容。然而,在Windows上,当您在根驱动器上调用该方法时,它还会产生一些 - 缺少更好的短语 - “虚拟”文件夹(如“文档和设置”,在最近的Windows版本中被“用户”替换)

如果您为其中一个“虚拟”文件夹调用listFiles(),它将始终返回null。这就是我的问题所在,因为我想以递归方式遍历所有文件夹。我需要一种方法来过滤这些文件夹,最好不要检查它们的名字......

还有一些额外的文件夹,普通用户看不到(如“系统卷信息”或该驱动器的Recycle-bin文件夹),我很乐意找到一种方法将其过滤为没有将名字列入黑名单。

不幸的是,这些文件夹的行为与真实文件夹一样。我正在寻找的东西就像File.isSystemFolder() - 方法。

我非常感谢任何建议

2 个答案:

答案 0 :(得分:2)

您可以通过测试File#isHidden()是否返回true来过滤这些隐藏的系统文件夹。

我不确定“虚拟”文件夹。我认为区分它们只能用Java 7中的New IO 2来实现。我必须先在Vista / Win7机器上检查它(我目前在XP上)。


更新:我在2K3服务器上进行了快速测试,文档和设置默认情况下还会为true返回File#isHidden(),而< em>用户没有。你也可以利用它。

答案 1 :(得分:0)

我认为你不会对File.isSystemFolder方法感到满意,因为我无法想象强加一个“系统文件夹”的定义是否容易,它对于范围内的JVM来说足够广泛操作系统能够正确有效地实现。正如Balus建议的那样,检查非隐藏文件夹是一个良好的开端,并且可能已经足够了(因为这会复制他们在资源管理器shell中看到的内容)。

关于“虚拟”文件夹 - 首先,您确定它们是虚拟的吗? C:\Documents and Settings(或更晚,C:\Users)不是此文件夹的真实,规范路径吗?如果不是,那么您可以通过查看是否getCanonicalPath().equals(getAbsolutePath())轻松地在窗口上清除这些内容(只要您准备好使用多余的... s进行一些误报。

如果这不起作用,那么它们只是普通的文件夹 - 您需要考虑这些文件夹具有哪些逻辑属性才能使它们成为“虚拟”。或者换句话说,提出一些谓词,可以用File上的方法表示,它捕获你想要过滤的内容。根据你的英文描述,即使我现在也不确定会有什么不适合的内容。