Java可以识别某些文件和目录,但仍然认为它们不存在
我在Windows 10上使用Java 17和NTFS。有一个文件显示在Java操作中,但是当我尝试使用Java读取它时,它会抛出一个:A:\foo.bar
Files.list()
java.nio.file.FileSystemException
A:\foo.bar:该进程无法访问该文件,因为它正被另一个进程使用
没关系。还有另一个低级进程已锁定该文件。当我关闭其他进程时,Java可以很好地访问该文件。事实上,即使是Robocopy,在尝试访问此文件时,也会跳过该文件(实际上,Robocopy似乎复制了该文件,但它没有)。因此,到目前为止,没有什么神秘之处 - 另一个过程是锁定文件以进行独占访问。
但这是奇怪的部分。在大多数情况下,该文件在 Java 中显示为正常:
- 正如我所提到的,该文件显示在 一个 .
A:\foo.bar
Files.list()
A:\
- 如果我调用 ,它将按预期返回。
Files.isRegularFile(fooBarFile)
true
- 如果我调用 ,它会像我预期的那样转动(在这种情况下很有用)。
Files.isReadable(fooBarFile)
false
- 如果我调用,我会看到属性(时间戳等)。
Files.readAttributes(fooBarFile, "*")
- 如果我调用它,则返回 DOS 属性。
Files.readAttributes(fooBarFile, DosFileAttributes.class)
但是如果我调用Files.exists(fooBarFile),
它会返回false
!因此,似乎被另一个进程锁定为独占访问的文件将返回 ,对我来说,这似乎不遵循其API中所述的方法的语义。false
exists()
exists()
实际上,通过检查是否返回但返回,查看文件是否无法访问似乎很有用;然而,这是出乎意料的,似乎没有记录在案。这是预期的行为吗?它有文档记录吗?它在其他平台上是否工作相同,例如Linux?exists()
false
isRegularFile()
true
最后,我注意到Files.notExists(fooBarFile)
也返回,所以Java并不是说该文件不存在,只是说它不存在。嗯......我能做到这一点的唯一方法是if意味着“可访问”,但API合约不谈论可访问性。该文档添加了:false
exists()
exists()
notExists()
请注意,此方法不是现有方法的补充。如果无法确定文件是否存在,则两种方法都返回 false。
这似乎也不适用于这种情况。因此,尽管这种行为很有用,但它是出乎意料的,似乎没有记录在案,因此我对过度依赖它犹豫不决。任何人都可以提供更多信息或更好但更权威的文档吗?
更新:类似的事情似乎发生在不可读的目录上。例如,A:\系统卷信息
目录在 Windows 上被标记为“隐藏”和“只读”。如果您尝试访问它,它同样会引发异常。但是回来了,即使回来了!实际上,它的行为与上面的项目符号完全相同,只是返回而不是 。java.nio.file.FileSystemException
Files.exists()
false
Files.isDirectory()
true
isDirectory()
true
isRegularFile()
因此,它似乎是重复的(至少在Windows上的OpenJDK 17上),即使这种行为似乎并不遵循API契约。这是一个JDK错误吗?Files.exists()
Files.isReadable()
Files.exists()