2009-10-12 15 views
6

Qual è il modo più succinto di creare una directory denominata "Foo" al di sotto della directory di lavoro corrente della mia applicazione Java (se non esiste già)?Come creare una directory all'interno della directory di lavoro corrente, in Java

Oppure un angolo leggermente diverso: qual è l'equivalente Java di Directory.CreateDirectory("Foo") in .NET?

+0

Hai fatto una domanda e hai immediatamente pubblicato la tua risposta? – KLE

+0

-1. Sembra molto strano pubblicare una domanda e una risposta. Stack Overflow non è un microfono da cui tenere lezioni. –

+4

+1. Va bene pubblicare la tua domanda e risposta. Aiuta la comunità e utile per riferimenti futuri. Se le persone non sono d'accordo con la tua risposta, possono fornirne una migliore. Una ricerca * rapida * su Meta SO sembra essere d'accordo sul fatto che questo va bene. – Iain

risposta

7

Il pacchetto java.io non ha una classe Directory, ma è possibile utilizzare il metodo mkdir() sulla classe File invece:

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

Nota che mkdir() ha due distinte modalità di guasto:

  1. "Se esiste un gestore di sicurezza e il suo metodo checkWrite() non consente la creazione della directory denominata", verrà generato un valore SecurityException.
  2. Se l'operazione non riesce per un altro motivo, mkdir() restituirà false. (Più precisamente, si restituirà vero se e solo se è stata creata la directory.)

punto 1 è ok - se non si dispone dell'autorizzazione, buttare. Il punto 2 è un po 'non ottimale per tre ragioni:

  1. È necessario controllare il risultato booleano da questo metodo. Se ignori il risultato, l'operazione potrebbe fallire silenziosamente.
  2. Se si ottiene un ritorno falso non si ha idea del perché l'operazione abbia avuto esito negativo, il che rende difficile il ripristino o la formulazione di un messaggio di errore significativo.
  3. La rigida dicitura "se e solo se" del contratto indica anche che il metodo restituisce false se la directory esiste già.

parte: Contrasto punto 3 con il comportamento del .NET Directory.CreateDirectory() che non fa nulla se la directory esiste. Questo tipo di ha senso - "creare una directory "; "ok, la directory è creata". Importa se era creato ora o prima; da questo processo o un altro? Se davvero ti preoccupi di quello , non ti chiederebbe una diversa domanda : "Esiste questa directory?"

L'avvertenza successiva è che mkdir() non creerà più di una directory alla volta. Per il mio semplice esempio di una directory chiamata "Foo" questo va bene; tuttavia, se si desidera creare una directory denominata Barra all'interno della directory Foo (ad esempio, per creare la directory "Foo/Bar") è necessario ricordare di utilizzare invece il metodo mkdirs().

Quindi, per aggirare tutti questi avvertimenti, è possibile utilizzare un metodo di supporto come la seguente:

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

Hai fatto una domanda e hai immediatamente postato la tua risposta? –

+5

Visto che prima, l'idea è che l'utente che pubblica la combinazione domanda + risposta vuole presentare una risposta esauriente ad alcune domande che possono sembrare semplici in un contesto che dirigerà quelle persone che non sanno ancora come farlo propria risposta Perfettamente accettabile a mio avviso anche se un po 'confuso. – Esko

+1

Ah, quindi ora so come parte del "Blog" della visione di Stackoverflow (http://sstatic.net/so/Img/stackoverflow-venn-diagram.png) proviene da :) – sfussenegger

1

ho visto una forma un po 'più di gestire il metodo di createDirectory:

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

Potrebbe anche essere utile verificare se esiste lo f ma non è una directory.

Problemi correlati