4

我在 Windows 8
上。JavadocFile#list()声称它“如果此抽象路径名不表示目录,或者发生 I/O 错误,则返回 null。”

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

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

基本上,这是File#isDirectory()一个无用的调用,并迫使您检查File#list() != null是否要确保它File确实是一个目录。

除非我错了,否则没有其他方法可以“确定”检查文件是否实际上是目录?File#list()如果您在文件系统上的每个文件夹上都执行此操作,这是一个非常昂贵的方法调用。

这是一个说明该问题的 Java 文件:http: //pastebin.com/ieH0xTek 它只能在 Windows 上运行。

4

1 回答 1

2

隐藏的系统连接(例如Local SettingsApplication Data是特殊的

这些连接点的文件属性为 FILE_ATTRIBUTE_REPARSE_POINT 和 FILE_ATTRIBUTE_SYSTEM,并且访问控制列表 (ACL) 必须设置为“Everyone Deny Read”。应用程序必须具有权限才能调用和遍历特定路径。但是,枚举这些连接点的内容是不可能的。

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

使用 Java 7 的NIO.2 文件系统 API,应该可以检测到这些链接并可能解析它们的目标路径。

于 2013-10-13T13:15:02.987 回答