Java找到了一个;“文件和设置”;Win 7 HP上的文件夹。我能';我看不到

Java找到了一个;“文件和设置”;Win 7 HP上的文件夹。我能';我看不到,java,windows-7,recursion,directory,Java,Windows 7,Recursion,Directory,在Java中,我试图列出我的C:\目录中的文件和文件夹,并使用以下命令循环它们: File[]files=新文件(“C:\\”).listFiles() 然而,令我惊讶的是,当我在数组中循环时,我发现第一个索引是C:\Documents and Settings!首先,我运行的是Windows 7 Home Premium,我甚至还没有从Windows XP或任何东西升级,但无论我做什么,我都无法在驱动器上看到此文件夹,而是选择查看隐藏文件夹 此外,正如您所怀疑的,当您开始使用递归方法查看驱动器

在Java中,我试图列出我的
C:\
目录中的文件和文件夹,并使用以下命令循环它们:
File[]files=新文件(“C:\\”).listFiles()

然而,令我惊讶的是,当我在数组中循环时,我发现第一个索引是
C:\Documents and Settings
!首先,我运行的是Windows 7 Home Premium,我甚至还没有从Windows XP或任何东西升级,但无论我做什么,我都无法在驱动器上看到此文件夹,而是选择查看隐藏文件夹

此外,正如您所怀疑的,当您开始使用递归方法查看驱动器上的每个文件夹时,它会在尝试列出该目录中的文件时抛出一个
NullPointerException

有人知道为什么会这样,或者更好地知道如何解决这个问题吗?欢迎提出任何意见,提前谢谢



更新:我现在很快确定
C:\Documents and settings
是一个符号链接或“连接”,因此,问题是:如何确定它是Java中的符号链接,以便告诉for循环跳过任何内容?

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

在我的Windows 7系统上,“文档和设置”是用户的枢纽。您的代码可能应该检查目录条目是否为非真实目录

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

07/14/09  00:08    <JUNCTION>     Documents and Settings [C:\Users]
07/14/09 00:08文档和设置[C:\Users]

好的,我想这里有充分的答案。这里同时发生了几件事,这比乍一看要有趣一些

是的
文档和设置
是Vista+下的符号链接,不,这不是我们这里的问题。真正的问题是文件夹的访问权限非常有限——默认情况下,甚至管理员都无权访问它

如果我们阅读
isSymbolicLink
javadoc,它会清楚地说明:

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

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

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

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

好的,这很有趣,那么您建议我做些什么来修复Java代码并防止它将此“连接”视为要递归的目录?如上所述,使用Java nio包并尝试Files.isSymbolicLink方法。我已经实现了
Files.isSymbolicLink()
方法,但由于某些原因,它没有将
C:\Documents and Settings
检测为符号链接!要继续的
if
语句类似于
if(Files.isSymbolicLink(folder.toPath()&&…)
如果else块跳过了这个循环!+1非常感谢。尽管我没有接受你的答案,因为我觉得@Voo更完整,等等,但你确实很快为我指出了正确的方向,这很有帮助!通常在遍历目录时遵循符号链接是一个非常糟糕的主意。如果你想这样做,你必须请务必检测周期,否则您将陷入一个无休止的循环。unix中的大多数工具(经常看到符号链接)默认情况下都会忽略它们..啊,所以它是一个符号链接。这实际上是我问题的一部分-我不明白为什么它会出现在由
listFiles()生成的数组中
但我无法在Windows资源管理器中看到它。请查看我的修订问题。原始java文件API受到严重限制,在许多不同方面存在缺陷-我不确定您将如何处理它。新的Java7文件API有了很大的改进,允许您指定如何处理符号链接的选项:感谢Voo。请e我对@schtever答案的评论虽然显然是一个权限问题,但Documents and Settings文件夹的访问权限非常有限,isSymbolicLink声明:
false,如果文件[…]无法确定该文件是否为符号链接。
。您应该首先检查是否可以读取该文件:
文件。isReadable(file)
将在此处为您返回false。对此帖子进行了回答:)谢谢您的回答,但我使用的是英文版Windows 7。很高兴知道。很抱歉回复太晚,感谢上帝你发布了完整的答案-非常感谢!当然,首先检查Java是否可以读取文件夹是有意义的——即使它是一个符号链接,如果Java甚至没有足够的权限,那么尝试也没有意义;现在我觉得自己很蠢,连想都没想!再次感谢你,我认为这个问题对我来说非常有用。PS不用说,它现在正在工作/完全忽略这些文件夹!