为什么'File.exists'返回true,即使NIO'Files'类中的'Files.exists'返回false

The*_*tor 14 java nio file file-exists

我正在尝试确定网络文件夹中是否存在文件:

// File name is "\\QWERTY\folder\dir\A123456.TXT"
Path path = Paths.get("\\\\QWERTY\\folder\\dir\\A123456.TXT")
Run Code Online (Sandbox Code Playgroud)

使用NIO Files:

Files.exists(path) == false
Run Code Online (Sandbox Code Playgroud)

使用File:

path.toFile().exists() == true
Run Code Online (Sandbox Code Playgroud)

File根据我们的测试,使用似乎是正确的.为什么File工作比Files

那么,这是什么?不能两者兼得!

但是等等,还有Files.notExists(path).

当网络共享文件实际存在时

Files.exists(path): false
Files.notExists(path): false
path.toFile().exists(): true
Run Code Online (Sandbox Code Playgroud)

当网络共享文件实际上并不会存在

Files.exists(path): false
Files.notExists(path): true
path.toFile().exists(): false
Run Code Online (Sandbox Code Playgroud)

另一种同样疯狂的方式来看上面的三个结果

boolean exists = Files.exists(path) || !Files.notExists(path)
boolean notExists = Files.notExists(path) || !Files.exists(path)
boolean oldFashionedExists = path.toFile().exists()
Run Code Online (Sandbox Code Playgroud)

:smileyFace:

环境与评论

该程序在Windows 8.1 Pro 32位计算机(操作系统和计算机)上运行,并从Windows 2008 R2(32位)计算机检查网络共享.

为了确定Files.exists失败,我安装了一个WatchService来监视该文件夹,并在Files.exists检查时看到该文件确实存在.然后我记录了两个方法,发现File.exists是正确的.

现在,在我的代码中,我将检查为Files.exists(path) || path.toFile().exists().

有点必须做两件事似乎很愚蠢.可能只是逃脱后来.只是试图让工程师在甲骨文身上得到怀疑的好处,但整个事情是相当愚蠢的,他们报告的不同.

另外,我不在乎"存在"是否立即过时.我只是想知道文件是否存在于我们正在检查的那一刻.我从来没有遇到过这种情况 - 我和我的另一位开发人员花了30个小时试图弄清楚为什么我们的程序没有因为这个'功能'而接口.

冥想这一段时间

File.exists():当且仅当此抽象路径名表示的文件或目录存在时,返回true ; 否则是假的.

Files.exists():如果文件存在,则返回true; 如果文件不存在或无法确定其存在,则返回 false .

这让我感到震惊!"当且仅当此抽象路径名表示的文件或目录存在时;否则为false"与"如果文件存在则为";如果文件不存在或无法确定其存在,则为false

那么,File.exists如果"存在无法确定" ,怎么还可以呢?显然,存在可以(并且正在)由File确定,但不是由Files确定.

pax*_*blo 6

至于为什么两者之间可能存在差异,请将其文档对比:

File.exists():当且仅当此抽象路径名表示的文件或目录存在时,返回true; 否则是假的.

Files.exists():如果文件存在,则返回true; 如果文件不存在或无法确定其存在,则返回 false .

可能解释了两者之间的差异,也许Files是在确定文件的存在时遇到了麻烦.

例如,在Linux下,可以设置目录和文件权限,以便您可以打开存在但无法查看存在的文件(通过取消文件所在的目录的读取权限,同时保留文件权限更开放).

根据Oracle的更多文档,Files.exists()只有true在验证文件存在的情况下才会返回.

的返回值false意味着它不存在.

他们建议您使用两者exists()notExists()涵盖三种可能性,例如:

if (Files.exists(fspec)) {
    System.out.println("It exists!");
else if (Files.notExists(fspec)) {
    System.out.println("It does not exist!");
else
    System.out.println("I have no idea!");
Run Code Online (Sandbox Code Playgroud)

这涵盖了上述链接中涵盖的文件状态的三种可能性:

  • 该文件已验证存在.
  • 该文件已验证不存在.
  • 文件的状态未知.当程序无权访问该文件时,可能会发生此结果.