【发布时间】:2015-08-11 18:22:01
【问题描述】:
我正在尝试确定网络文件夹中是否存在文件:
// 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 Pro 32 位机器(操作系统和机器)上运行,并检查来自 Windows 2008 R2(32 位)机器的网络共享。
为了确定 Files.exists 失败,我安装了一个 WatchService 来监视文件夹,并在 Files.exists 检查时看到该文件确实存在。然后我以两种方法登录,发现 File.exists 是正确的。
现在,在我的代码中,我的支票是Files.exists(path) || path.toFile().exists()。
两者都做似乎有点愚蠢。可能以后就可以逍遥法外了。只是试图让甲骨文的工程师受益于怀疑,但整个事情都是相当愚蠢的,他们报告的不同。
另外,我不在乎“存在”是否立即过时。我只想知道文件在我们检查的那一刻是否存在。我从来没有遇到过这种情况——我们只是在我和另一位开发人员之间花了 30 个小时试图弄清楚为什么我们的程序因为这个“功能”而没有接口。
沉思一下
File.exists():返回真当且仅当此抽象路径名表示的文件或目录存在时;否则为假。
Files.exists():如果文件存在则返回true;如果文件不存在或无法确定其存在,则为 false。
这让我崩溃了! “当且仅当此抽象路径名表示的文件或目录存在;否则为假”与“如果文件存在则为真;如果文件不存在或无法确定其存在则为假”不一致。
那么,如果“无法确定存在”,File.exists 怎么可能是真的呢?显然,存在可以(并且正在)由 File 而不是由 Files 确定。
【问题讨论】:
-
Fils.exists文档:Note that the result of this method is immediately outdated. If this method indicates the file exists then there is no guarantee that a subsequence access will succeed. Care should be taken when using this method in security sensitive applications.。这可能是问题所在,尤其是在网络上。 -
@user1803551,我很确定另一个人也是如此,在 either 情况下不能保证有人不会在您的支票和尝试使用。
-
你可以试试
Files.notExists,看看你得到了什么结果? -
小心 UNC 路径,遇到了很多麻烦,尤其是在 Windows 8 上
-
“那么,如果“无法确定存在”,File.exists 怎么可能是真的呢?显然,存在可以(并且正在)由 File 而不是由 Files 确定。 " File.exists() 方法仅适用于
File实例,它表示文件系统上的资源。Files.exists(Path)与Path实例一起使用,它可以捕获(取决于可用的 FileSystemProviders)不在文件系统中的东西。
标签: java file nio file-exists