为什么java文件#列表()工作在Windows连接点?

我在Windows 8上。
Javadoc for File#list()声明“如果此抽象path名不表示一个目录,或者发生I / O错误,则返回null”。

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

在“Application Data”上调用File#isDirectory()返回true 。 但是,调用“Application Data”上的File#list()每次都会返回null,所以这不是I / O错误。

基本上,这使得File#isDirectory()成为一个无用的调用,并强制你检查File#list() != null如果你想确定File确实是一个目录。

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

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

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

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

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

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