java - 为什么 java File#list() 不能在 Windows 连接点上工作?

标签 java windows

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

现在,以“目录”(实际上是 NTFS 结点)“应用程序数据”(位于 C:\Users\[用户名] 目录中)为例。

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

基本上,这会使 File#isDirectory() 成为一个无用的调用,如果您想确保File 确实是一个目录。

除非我错了,否则没有其他方法可以“确定”地检查一个文件是否真的是一个目录? File#list() 是一个非常昂贵的方法调用,如果你对文件系统上的每个文件夹都这样做的话。

这是一个 Java 文件,它举例说明了这个问题: http://pastebin.com/ieH0xTek 它仅适用于 Windows。

最佳答案

隐藏的系统连接(例如Local SettingsApplication Data)are special :

These junction points have file attributes of FILE_ATTRIBUTE_REPARSE_POINT and FILE_ATTRIBUTE_SYSTEM, and the access control lists (ACLs) must be set to "“Everyone Deny Read". Applications must have permissions in order to call out and traverse a specific path. However, enumerating the contents of these junction points is not possible.

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

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

关于java - 为什么 java File#list() 不能在 Windows 连接点上工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19327942/

相关文章:

java - 在字符串集合中查找相关部分

c++ - 未使用的函数返回值会怎样?

c# - 从 Windows 应用商店应用程序访问本地文件夹?

C# Windows 服务和控制台应用程序合二为一

windows - 在 Windows 8 上开发应用程序的最低硬件和软件要求?

java - 调用 getter 时出现 NullPointerException

java - 如何使用java远程挂载iso镜像?

java - 如何在 Windows 下的 Java 服务中添加时间戳 GC 日志文件名?

Java 8 lambdas 将列表分组到映射中 - 如果每个键有多个列表项,则不同的键

windows - 使用 -replace 从 csv 中的单元格中删除带有特殊字符的字符串