【问题标题】:Java finds a "Documents and Settings" folder on Win 7 HP. I can't see oneJava 在 Win 7 HP 上找到“文档和设置”文件夹。我一个都看不到
【发布时间】: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 Settiingssymlink"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


【解决方案1】:

好的,我认为这需要一个完整的答案。这里同时发生了几件事,这使得它比乍一看更有趣。

是的Documents and Settings 是Vista+ 下的符号链接,不,这不是我们这里的问题。真正的问题是该文件夹有一些极其受限的访问权限——默认情况下甚至管理员都无法访问它。

如果我们阅读isSymbolicLink javadoc,它清楚地指出:

如果 [...] 无法确定文件是否为符号文件,则为 false 链接与否

由于我们没有访问该目录的任何权限,我们无法确定它是否是符号链接。但是,由于我们随后尝试访问该文件,因此我们得到一个异常,告诉我们无法访问该文件。

因此正确的检查应该如下所示:

if (!Files.isReadable(file) || Files.isSymbolicLink(file)) continue;

【讨论】:

  • 抱歉回复晚了,感谢上帝您发布了完整的答案 - 非常感谢!当然,首先检查 Java 是否可以读取该文件夹是有意义的——即使它是一个符号链接,如果 Java 甚至没有足够的权限,那么尝试是没有意义的;现在我觉得自己很愚蠢,我什至没有考虑过!再次感谢您,我认为这个问题对我来说非常有用。 PS 不用说它现在可以正常工作/完美地忽略这些文件夹!
【解决方案2】:

在我的 Windows 7 系统上,“文档和设置”是用户的一个连接点。您的代码可能应该检查目录条目是否不是真实目录。

要在您的系统上查看它,请从命令窗口执行“DIR /AS C:\”。您应该会看到如下内容:

07/14/09  00:08    <JUNCTION>     Documents and Settings [C:\Users]

【讨论】:

  • 好的,这很有趣,那么您建议我做什么来修正 Java 代码并防止它将此 "JUNCTION" 视为递归目录?
  • 如前所述,使用Java nio包并尝试Files.isSymbolicLink方法。
  • 我已经实现了Files.isSymbolicLink() 方法,但由于某种原因,它没有将C:\Documents and Settings 检测为符号链接!我要继续的 if 语句看起来像 if(Files.isSymbolicLink(folder.toPath() &amp;&amp; ... ) 并且如果 else 块只是跳过该循环!
  • +1 非常感谢。尽管我没有接受您的回答,因为我觉得 @Voo 的更完整等,但您确实很快为我指出了正确的方向,这很有帮助!
【解决方案3】:

我认为当您以英语以外的其他语言使用 Windows 7 时,它会翻译资源管理器中的文件夹名称,但文件系统中的名称保持不变。如果您使用另一种语言,请查找名称为您的语言的文件夹。如果没有,没关系。

【讨论】:

  • 感谢您的回答,但我使用的是英文版的 Windows 7。不过很高兴知道。
猜你喜欢
  • 1970-01-01
  • 2015-04-25
  • 2015-12-13
  • 1970-01-01
  • 2012-06-07
  • 1970-01-01
  • 1970-01-01
  • 2012-12-01
  • 1970-01-01
相关资源
最近更新 更多