为什么“File.exists”返回 true,即使 NIO “Files” 类中的 “Files.exists” 返回 false
我正在尝试确定网络文件夹中是否存在文件:
// File name is "\\QWERTY\folder\dir\A123456.TXT"
Path path = Paths.get("\\\\QWERTY\\folder\\dir\\A123456.TXT")
使用蔚来汽车 :Files
Files.exists(path) == false
用:File
path.toFile().exists() == true
根据我们的测试,使用似乎是正确的。为什么比 ?File
File
Files
那么,它是什么呢?不能两者兼而有之!
但是等等,还有.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()
:笑脸:
环境和注释
该程序在 Windows 8.1 专业版 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 否则“与”如果文件存在,则为 true;如果文件存在;如果文件存在,则为 false如果文件不存在或无法确定其存在,则为 false”
那么,如果“无法确定存在”,怎么可能仍然是正确的呢?显然,存在可以(并且正在)由File决定,但不能由File决定。File.exists