当前位置: 代码迷 >> java >> File.listFiles()并区分物理文件夹和虚拟文件夹
  详细解决方案

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

热度:105   发布时间:2023-08-02 11:06:12.0

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

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

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

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

我真的很感谢任何建议

您可以通过测试返回true来过滤这些隐藏的系统文件夹。

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


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

我不认为你会对File.isSystemFolder方法好运,因为我无法想象对一系列操作系统上的JVM进行足够宽泛的“系统文件夹”定义会很容易能够正确有效地实施。 正如Balus建议的那样,检查非隐藏文件夹是一个良好的开端,并且可能已经足够了(因为这会复制他们在资源管理器shell中看到的内容)。

关于“虚拟”文件夹 - 首先,你确定它们是虚拟的吗? C:\\Documents and Settings (或更高版本, C:\\Users )不是此文件夹的真实,规范路径吗? 如果不是,那么你可以很容易地看到这些杂草出来的窗口是否getCanonicalPath().equals(getAbsolutePath())只要你用多余的一些假阳性准备. S和.. S)。

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

  相关解决方案