我在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 Settings
或Application Data
) 是特殊的 :
这些连接点具有FILE_ATTRIBUTE_REPARSE_POINT和FILE_ATTRIBUTE_SYSTEM的文件属性,并且访问控制列表(ACL)必须设置为“”Everyone拒绝读取“。 应用程序必须具有权限才能调出和遍历特定的路径。 但是,列举这些连接点的内容是不可能的。
这意味着它们不能以标准方式遍历(由于安全设置)。 不幸的是,没有办法通过旧的Java File API来处理这些路口。
使用Java 7的NIO.2文件系统API ,应该可以检测这些链接,并可能解决其目标路径。