Files.exists(path)返回false但file.exists()返回true

3
为什么这段代码返回false?
Path path = Paths.get("C:\\aaa\\bbb\\ccc");
Files.exists(path); // false!?

即使我从文件(已存在)进行转换:
File file = new File("C:\\aaa\\bbb\\ccc");
file.exists(); // true!!!
Path path = file.toPath();
Files.exists(path); // still false!?

1
Files.size(path); 会抛出异常吗?如果会,那么这个异常是否包含有意义的信息? - VGR
这对我来说没问题。 - Scary Wombat
1
mkdir -p /mnt/c/aaa/bbb touch /mnt/c/aaa/bbb/ccc File file = new File("C:\\aaa\\bbb\\ccc"); System.out.println(file.exists()); // true Path path = file.toPath(); System.out.println(Files.exists(path)); // true - Scary Wombat
1
C:\aaa\bbb\ccc 是一个符号链接吗?文件的权限是什么?请创建一个 [mcve] 来演示这个问题,并验证如果周围没有其他代码,这个问题是否仍然存在。请发布 [mcve] 的完整代码。 - Jim Garrison
我的错误。我使用了Iterator<Path> iterator = path.iterator();来尝试获取目录中的文件并递归调用我的方法。我们可能可以删除这篇帖子。抱歉。[Jim Garrison的答案可能对某些人有用] - sikidhart
1个回答

5

我能够在以下特定情况下重现此问题:

  1. 操作系统为Windows(根据路径语法隐含)
  2. 路径引用一个目录
  3. 该目录是只读的,或者用户没有“列出文件夹内容”的权限。

我在Linux(Centos 6)上进行了测试,即使更改目录的文件模式(例如 chmod -x /aaa/bbb/cccchmod -r /aaa/bbb/ccc),也无法重现该问题。

因此,这似乎仅在Windows上发生。 java.iojava.nio.file 在Windows上实现文件权限方面的存在测试方式之间必须存在某些差异。

检查目录权限。

可能是值得报告的错误。


问题是由我的错误引起的。但为了确认,是的,Windows,只读目录。我不确定如何更改“列出文件夹内容”权限。感谢您的调查。已点赞。 - sikidhart
有趣的是,在Linux上,即使是只读目录,所有调用都会按预期返回“true”。 - Jim Garrison

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接