![](/img/trans.png)
[英]Why does 'Files.exists' return true, but 'File.exists' return false? it occur only when filename in multibyte characters
[英]Why does 'File.exists' return true, even though 'Files.exists' in the NIO 'Files' class returns false
我正在嘗試確定網絡文件夾中是否存在文件:
// 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
似乎是正確的。 為什么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()
:smileyFace:
環境與評論
該程序在Windows 8.1 Pro 32位計算機(操作系統和計算機)上運行,並從Windows 2008 R2(32位)計算機檢查網絡共享。
為了確定Files.exists失敗,我安裝了一個WatchService來監視該文件夾,並在Files.exists檢查時看到該文件確實存在。 然后我記錄了兩個方法,發現File.exists是正確的。
現在,在我的代碼中,我將檢查為Files.exists(path) || path.toFile().exists()
Files.exists(path) || path.toFile().exists()
。
有點必須做兩件事似乎很愚蠢。 可能只是逃脫后來。 只是試圖讓工程師在甲骨文身上得到懷疑的好處,但整個事情是相當愚蠢的,他們報告的不同。
另外,我不在乎“存在”是否立即過時。 我只是想知道文件是否存在於我們正在檢查的那一刻。 我從來沒有遇到過這種情況 - 我和我的另一位開發人員花了30個小時試圖弄清楚為什么我們的程序沒有因為這個'功能'而接口。
冥想這一段時間
File.exists(): 當且僅當此抽象路徑名表示的文件或目錄存在時 ,返回true; 否則是假的。
Files.exists():如果文件存在,則返回true; 如果文件不存在或無法確定其存在,則返回 false 。
這讓我感到震驚! “當且僅當此抽象路徑名表示的文件或目錄存在時;否則為false”與“如果文件存在則為”;如果文件不存在或無法確定其存在,則為false
那么,如果“存在無法確定”, File.exists
仍然可以成為現實嗎? 顯然,存在可以(並且正在)由File確定,但不是由Files確定。
至於為什么兩者之間可能存在差異,請將其文檔對比:
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!");
這涵蓋了上述鏈接中涵蓋的文件狀態的三種可能性:
我有同樣的問題,但你的黑客並沒有幫助我。 當文件實際存在時,所有方法都返回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更新了有關文件夾的信息
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.