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

时间:2015-05-29 02:32:54

标签: java file nio file-exists

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

// File name is "\\QWERTY\folder\dir\A123456.TXT"
Path path = Paths.get("\\\\QWERTY\\folder\\dir\\A123456.TXT")

使用NIO Files

Files.exists(path) == false

使用File

path.toFile().exists() == true

根据我们的测试,使用File似乎是正确的。为什么FileFiles效果更好?

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

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

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

Files.exists(path): false
Files.notExists(path): false
path.toFile().exists(): true

当网络共享文件确实

Files.exists(path): false
Files.notExists(path): true
path.toFile().exists(): false

查看上述三个结果的另一种同样疯狂的方法

boolean exists = Files.exists(path) || !Files.notExists(path)
boolean notExists = Files.notExists(path) || !Files.exists(path)
boolean oldFashionedExists = path.toFile().exists()

: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”与“如果文件存在则为”;如果文件不存在或无法确定其存在,则为“

那么,如果“无法确定存在”,File.exists如何才能成真呢?显然,存在可以(并且正在)由文件确定,而不是由文件确定。

2 个答案:

答案 0 :(得分:5)

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

  

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

     

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

那可能可能解释了两者之间的区别,也许Files可能有麻烦确定文件的存在。

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

根据more of Oracle's documentation,如果验证文件存在,则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!");

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

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

答案 1 :(得分:0)

我有同样的问题,但你的黑客对我没有帮助。当文件实际存在时,所有方法都返回false:

Files.exists(path) = false, 
path.toFile().exists() = false, 
Files.notExists(path) = true, 
Files.exists(path) || path.toFile().exists() = false

但是,如果此时在资源管理器中打开了一个包含此文件的网络目录,那么它的存在是否正确处理

我通过在目录中创建一个新文件(然后将其删除)解决了这个问题:

Files.createFile(Paths.get(path.getParent().toString(), "test"));

在该命令之后,显然,Windows更新了有关文件夹的信息