2009-10-12 89 views
6

在我的Java應用程序的當前工作目錄下創建一個名爲「Foo」的目錄(如果它尚不存在),最簡潔的方法是什麼?如何在當前工作目錄中創建一個目錄,使用Java

或者,稍有不同:在.NET中,什麼是Directory.CreateDirectory("Foo")的Java等價物?

+0

你問了一個問題,並立即發佈自己的答案? – KLE 2009-10-12 12:27:48

+0

-1。看起來很奇怪發佈一個問題和答案。堆棧溢出不是您要講授的麥克風。 – 2009-10-12 12:37:40

+4

+1。發佈自己的問題和答案並不錯。幫助社區併爲將來的參考提供幫助。如果人們不同意你的答案,那麼他們可以提供更好的答案。 Meta SO上的*快速*搜索似乎同意這很好。 – Iain 2009-10-12 12:42:34

回答

7

java.io包不具有Directory類,但你可以使用mkdir()方法上File類,而不是:

(new File("Foo")).mkdir() 

注意mkdir()有兩個獨立的失效模式:

  1. 「如果安全管理器存在且其checkWrite()方法不允許創建指定的目錄」則將引發SecurityException
  2. 如果由於其他原因導致操作失敗,mkdir()將返回false。 (更具體地說,它將返回當且僅當創建的目錄真。)

1點是好的 - 如果你沒有權限,扔掉。由於三個原因,點2有點次優:

  1. 您需要檢查此方法的布爾結果。如果您忽略結果,操作可能會默默失敗。
  2. 如果你得到一個虛假的回報,你不知道爲什麼操作失敗,這很難恢復,或制定一個有意義的錯誤消息。
  3. 合同中嚴格的「if if if」用法也意味着如果該目錄已經存在,則該方法返回false。

旁白:對比點3的.NET Directory.CreateDirectory()這 什麼都不做,如果該目錄存在 行爲。 這種說法有道理 - 「創建一個 目錄」; 「好的,目錄是 創建」。如果是現在或更早創建的 ,這有什麼關係?通過這個 過程還是另一個?如果你真的 關心這一點,你不會問一個不同的 問題:「這個目錄是否存在?」

下一個警告是,mkdir()不會一次創建多個目錄。對於我名爲「Foo」的目錄的簡單示例,這很好;然而,如果你想在目錄Foo中創建一個名爲Bar的目錄(即創建目錄「Foo/Bar」),你必須記住使用mkdirs()方法。

因此,要解決所有這些需要注意的地方,你可以使用一個輔助方法,如下列:

public static File createDirectory(String directoryPath) throws IOException { 
    File dir = new File(directoryPath); 
    if (dir.exists()) { 
     return dir; 
    } 
    if (dir.mkdirs()) { 
     return dir; 
    } 
    throw new IOException("Failed to create directory '" + dir.getAbsolutePath() + "' for an unknown reason."); 
} 
+0

你問了一個問題,並立即發佈自己的答案? – 2009-10-12 12:24:54

+5

以前看過,這個想法是,發佈問題+答案組合的用戶想要對某個問題提出一個徹底的答案,這個問題在一個上下文中可能看起來很簡單,該上下文將指導那些還不知道如何去做他的人自己的答案。在我看來完全可以接受,儘管有點混亂。 – Esko 2009-10-12 12:28:15

+1

啊,所以現在我知道Stackoverflow的願景(http://sstatic.net/so/Img/stackoverflow-venn-diagram.png)的「Blog」部分來自:) – sfussenegger 2009-10-12 12:37:19

1

我看過你的createDirectory方法的稍微更簡潔的形式:

File f = new File(xyz); 
if (!f.exists() && !f.mkdirs()) throw new IOException("Could not create directory " + f); 

檢查f是否存在但不是目錄也是值得的。

相關問題