【发布时间】:2012-02-21 16:16:21
【问题描述】:
在 Java 中,我试图列出我的 C:\ 目录中的文件和文件夹,并使用:
File[] files = new File("C:\\").listFiles();
然而,令我惊讶的是,当我遍历数组时,我发现第一个索引是C:\Documents and Settings!首先,我运行的是 Windows 7 家庭高级版,我什至没有从 Windows XP 升级或任何东西,但无论我做什么,我都无法在我的驱动器上看到这个文件夹,尽管选择查看隐藏文件夹!?
此外,正如您所怀疑的,当您开始使用递归方法查看驱动器上的每个文件夹时,它会在尝试列出该目录中的文件时立即抛出 NullPointerException。
有谁知道这是为什么,或者更好地解决这个问题吗?任何想法表示赞赏,在此先感谢
更新:我现在很快确定 C:\Documents and Settiings 是 symlink 或 "JUNCTION",所以通过问题知道:我如何确定它是 Java 中的符号链接,以便我可以告诉 for 循环跳过任何一个?
【问题讨论】:
-
在遍历目录时遵循符号链接通常是一个非常糟糕的主意。如果你想这样做,你必须确保检测循环,否则你将陷入无限循环。默认情况下,unix 中的大多数工具(符号链接更常见)忽略它们..
-
啊,所以它是一个符号链接。这实际上是我的问题的一部分——我不明白为什么它出现在
listFiles()生成的数组中,但我在 Windows 资源管理器中看不到它。请参阅我修改后的问题。 -
原始的 java 文件 API 受到严重限制,并且在许多不同的方面都相当缺乏 - 我不确定你会如何做到这一点。新的 Java7 文件 API 得到了很大改进,允许您指定如何处理符号链接的选项:see here
-
谢谢你。请查看我对@schtever 答案的评论
-
显然是权限问题,Documents and Settings 文件夹有一些极其受限的访问权限,isSymbolicLink 声明:
false if the file [...] cannot be determined if the file is a symbolic link or not.。您应该首先检查您是否可以读取该文件:Files.isReadable(file)将在那里为您返回 false。从这篇文章中得到了答案:)
标签: java windows-7 recursion directory