有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

为什么java文件#list()不能在Windows连接点上工作?

我在Windows 8上
用于File#list()的Javadoc声明它“如果这个抽象路径名不表示目录,或者如果发生I/O错误,则返回null。”

现在,以“目录”(实际上是一个NTFS连接)“应用程序数据”(位于C:\Users\[Username]目录)为例

对“应用程序数据”调用File#isDirectory()返回true。然而,每次对“应用程序数据”调用File#list()都会返回null。。。所以这不是I/O错误

基本上,这会使File#isDirectory()成为一个无用的调用,并迫使您检查File#list() != null,如果您想确保File确实是一个目录

除非我错了,否则没有其他方法可以“确定”一个文件是否实际上是一个目录File#list()是一个非常昂贵的方法调用,如果你在文件系统的每个文件夹上都这样做的话

下面是一个Java文件,它举例说明了这个问题:http://pastebin.com/ieH0xTek 它只能在Windows上工作


共 (1) 个答案

  1. # 1 楼答案

    隐藏的系统连接(例如Local SettingsApplication Dataare special

    These junction points have file attributes of FILE_ATTRIBUTE_REPARSE_POINT and FILE_ATTRIBUTE_SYSTEM, and the access control lists (ACLs) must be set to "“Everyone Deny Read". Applications must have permissions in order to call out and traverse a specific path. However, enumerating the contents of these junction points is not possible.

    这意味着无法以标准方式遍历它们(由于安全设置)。不幸的是,没有办法通过旧的Java File API处理这些连接

    使用Java 7的NIO.2 file system API应该可以检测这些链接,并可能解析它们的目标路径