我在Windows 8上。
File#list()
的Javadoc声称它“如果此抽象路径名不表示目录,或者发生I / O错误,则返回null。”
现在,以“目录”(实际上是NTFS联结)“应用程序数据”(位于C:\ Users \ [Username]目录中)为例。
在“应用数据”上调用File#isDirectory()
会返回true
。但是,在“Application Data”上调用File#list()
每次都返回null ...所以它不是I / O错误。
基本上,这会使File#isDirectory()
成为无用的调用,并强制您检查File#list() != null
是否要确保File
确实是一个目录。
除非我错了,否则没有其他方法可以“确定”文件是否实际上是一个目录?如果您在文件系统上的每个文件夹上执行此操作,File#list()
是一种非常昂贵的方法调用。
这是一个Java文件,可以说明问题: http://pastebin.com/ieH0xTek 它只适用于Windows。
答案 0 :(得分:2)
隐藏的系统联结(例如Local Settings
或Application Data
)are special:
这些交接点的文件属性为 FILE_ATTRIBUTE_REPARSE_POINT和FILE_ATTRIBUTE_SYSTEM,以及访问权限 控制列表(ACL)必须设置为“”Everyone Deny Read“。 应用程序必须具有权限才能调用和遍历a 具体路径。但是,枚举这些连接的内容 分数是不可能的。
这意味着它们无法以标准方式遍历(由于安全设置)。遗憾的是,无法通过旧Java File API处理这些联结。
使用Java 7的NIO.2 file system API,应该可以检测这些链接,并可能解决它们的目标路径。