2009-01-22 72 views
49

我需要確定用戶提供的字符串是否是有效的文件路徑(即,如果createNewFile()會成功或拋出異常),但我不想爲了驗證目的而創建無用的文件而使文件系統膨脹,那麼有沒有一種方法可以確定我所擁有的字符串是否是有效的文件路徑而不嘗試創建文件?Java中有沒有一種方法可以確定路徑是否有效,而不嘗試創建文件?

我知道「有效文件路徑」的定義取決於操作系統,但我想知道是否有任何快速接受「C:/ foo」或「/ foo」並拒絕「香蕉」的方法。 。一個可能的方法可能是試圖創建文件,並最終刪除它,如果創建成功,但我希望有一個更優雅的方式來實現相同的結果...

+2

有人能告訴我如何上述問題完全與此相關 - http://stackoverflow.com/questions/13924808/check-if-a-path-is-valid-or-legal-in-java?好的,我可以給出2個相似之處 - 兩個都是用英文寫的,用'is'這個詞。 除此之外還有什麼? – 2012-12-18 02:57:18

+0

來自klocwork的相關檢查器文檔:[SV.PATH](https://developer.klocwork.com/documentation/en/insight/10-1/sv-path):包含有用指南 – boly38 2016-02-04 13:27:19

回答

25

這將檢查目錄的存在以及。

File file = new File("c:\\cygwin\\cygwin.bat"); 
if (!file.isDirectory()) 
    file = file.getParentFile(); 
if (file.exists()){ 
    ... 
} 

看起來像file.canWrite()沒有給你一個明確的指示,如果你有權限寫入目錄。

+4

呃...我不想要檢查文件是否存在,我想檢查文件是否可以在當前文件系統上創建 – Raibaz 2009-01-22 11:46:56

+0

問題是在您檢查是否可以創建文件後,創建文件的能力可能會改變 – tddmonkey 2009-01-22 11:48:28

+1

krosenvold的代碼正在執行以下操作:傳入的文件名是否已經作爲目錄存在,如果不存在,它將存在的目錄是否存在?這是有道理的,因爲如果目錄在那裏,你可以創建文件(權限允許)請注意,新文件(「foo」)不會創建文件。 – mtruesdell 2009-01-22 12:45:44

14

許多事情可以去錯了,當你嘗試創建一個文件:

  • 你缺乏必要的權限;
  • 設備上沒有足夠的空間;
  • 設備遇到錯誤;
  • 自定義安全性的某些策略禁止您創建特定類型的文件;

更重要的是,這些可以當你嘗試和查詢之間改變,看你能不能,當你真正能。在多線程環境中,這是導致競爭狀況的主要原因之一,可能是某些程序的真正脆弱點。

基本上你只需要嘗試和創建它,看看它是否工作。這是做到這一點的正確方法。這就是爲什麼像ConcurrentHashMap這樣的東西有putIfAbsent(),所以檢查和插入是一個原子操作,不會受到競爭條件的影響。這裏玩的原則完全一樣。

如果這只是某些診斷或安裝過程的一部分,只需執行它並查看它是否有效。但是,不能保證它會在稍後工作。

基本上,您的程序必須足夠強大,才能優雅地死去,如果它無法寫入相關文件。

14

File.getCanonicalPath()對此非常有用。針對某些類型的無效文件名(例如,在Windows中爲CON,PRN,*?*)針對操作系統或文件系統進行解析時會拋出IO異常。但是,這只是一個初步檢查;您在創建文件時仍需要處理其他故障(例如,權限不足,驅動器空間不足,安全限制)。在Java 7中引入的

-1
boolean canWrite(File file) { 
    if (file.exists()) { 
    return file.canWrite(); 
    } 
    else { 
    try { 
     file.createNewFile(); 
     file.delete(); 
     return true; 
    } 
    catch (Exception e) { 
     return false; 
    } 
    } 
} 
20

Path類增加了新的選擇,如下所示:
(是否正常工作下Linux的 - 總是返回true)

 /** 
     * <pre> 
     * Checks if a string is a valid path. 
     * Null safe. 
     * 
     * Calling examples: 
     * isValidPath("c:/test");  //returns true 
     * isValidPath("c:/te:t");  //returns false 
     * isValidPath("c:/te?t");  //returns false 
     * isValidPath("c/te*t");  //returns false 
     * isValidPath("good.txt");  //returns true 
     * isValidPath("not|good.txt"); //returns false 
     * isValidPath("not:good.txt"); //returns false 
     * </pre> 
     */ 
     public static boolean isValidPath(String path) { 

      try { 

       Paths.get(path); 

      } catch (InvalidPathException | NullPointerException ex) { 
       return false; 
      } 

      return true; 
     } 
相關問題