File.listFiles()并将物理文件夹与虚拟文件夹区分开来

File.listFiles()方法列出文件夹的内容。 然而,在Windows上调用方法时,也会产生一些 – 缺less更好的短语 – “虚拟”文件夹(如“Documents and Settings”,在最近的Windows版本中被“Users”取代) 。

如果你然后为这些“虚拟”文件夹之一调用listFiles(),它总是返回null。 这就是我的问题,因为我想recursion遍历所有的文件夹。 我需要一种方法来过滤这些文件夹,最好不要通过检查他们的名字…

还有一些额外的文件夹,普通用户没有看到(如“系统卷信息”或该驱动器的回收站文件夹),我很乐意find一种方法过滤出来以及没有列入黑名单名字。

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

我非常感谢任何build议

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

我不确定“虚拟”文件夹。 我认为只有在Java 7中才有可能区分它们。我将首先在Vista / Win7机器上进行检查(我现在在XP上)。


更新 :我在我们的2K3服务器做了一个快速测试, 文档和设置默认情况下也会返回true ,而File#isHidden()用户不会。 你也可以使用它。

我不认为你会File.isSystemFolder一个File.isSystemFolder方法,因为我无法想象将一系列操作系统上的JVMs定义为“系统文件夹”的定义是很容易的能够正确和有用地执行。 正如Balus所建议的,检查非隐藏文件夹是一个好的开始,并且可能已经足够了(因为这复制了他们将在浏览器shell中看到的内容)。

关于“虚拟”文件夹 – 首先,你确定它们是虚拟的吗? 是C:\Documents and Settings (或更高版本, C:\Users )不是这个文件夹的真正的,规范的路径? 如果不是,那么通过查看getCanonicalPath().equals(getAbsolutePath())是否getCanonicalPath().equals(getAbsolutePath()) (只要你准备好多少带有多余的s和s的误报getCanonicalPath().equals(getAbsolutePath()) ,就可以很容易地将这些排除在窗口之外。

如果这不起作用,那么他们只是正常的文件夹 – 你需要考虑这些文件夹有什么逻辑属性,使他们“虚拟”。 或者换句话说,拿出一些谓词,可以通过File上的方法表达,捕捉你想要过滤的东西。 即使我现在还不确定,根据你的英文说明,什么可以,哪些不适合。