【问题标题】:File.listFiles() and distinguishing physical folders from virtual onesFile.listFiles() 和区分物理文件夹和虚拟文件夹
【发布时间】:2011-03-10 15:36:57
【问题描述】:

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

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

还有一些普通用户看不到的附加文件夹(如“系统卷信息”或该驱动器的回收站文件夹),我很高兴找到一种将它们过滤掉的方法不用把名字列入黑名单。

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

非常感谢您的任何建议

【问题讨论】:

    标签: java windows file-io directory


    【解决方案1】:

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

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


    更新:我在我们的 2K3 服务器上做了一个快速测试,默认情况下 Documents and Settings 还为 File#isHidden() 返回 trueUsers 不要。你也可以利用它。

    【讨论】:

      【解决方案2】:

      我认为File.isSystemFolder 方法不会让您走运,因为我无法想象将足够广泛的“系统文件夹”定义强加给 JVM 的一系列操作系统能够正确和有用地实施。正如 Balus 所建议的那样,检查非隐藏文件夹是一个好的开始,并且本身可能就足够了(因为这复制了他们在资源管理器 shell 中看到的内容)。

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

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

      【讨论】:

      • 感谢您的建议,不幸的是,规范路径和绝对路径是相同的,所以我将采用 isHidden() 方法。也许这毕竟不是一个糟糕的选择,因为用户可能希望首先避免隐藏文件夹^^
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-10
      • 1970-01-01
      • 2011-12-03
      • 2010-10-03
      • 2012-11-22
      • 1970-01-01
      相关资源
      最近更新 更多