为什么java File#list()不能在Windows Junction点上运行?

时间:2013-10-11 22:01:30

标签: java windows

我在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。

1 个答案:

答案 0 :(得分:2)

隐藏的系统联结(例如Local SettingsApplication Dataare special

  

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

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

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