簡體   English   中英

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

[英]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似乎是正確的。 為什么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() 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM