2009-10-12 17 views
6

¿Cuál es la forma más concisa de crear un directorio llamado "Foo" debajo del directorio de trabajo actual de mi aplicación Java (si no existe)?¿Cómo creo un directorio dentro del directorio de trabajo actual, en Java

O, un ángulo ligeramente diferente: ¿Cuál es el equivalente Java de Directory.CreateDirectory("Foo") en .NET?

+0

¿Hizo una pregunta e inmediatamente publicó su propia respuesta? – KLE

+0

-1. Parece muy extraño publicar una pregunta y una respuesta. Stack Overflow no es un micrófono para dar conferencias. –

+4

+1. Está bien publicar tu propia pregunta y respuesta. Ayuda a la comunidad y útil para referencia futura. Si las personas no están de acuerdo con su respuesta, entonces pueden proporcionar una mejor. Una búsqueda * rápida * en Meta SO parece estar de acuerdo en que esto está bien. – Iain

Respuesta

7

El paquete java.io no tiene una clase Directory, pero se puede utilizar el método de la clase mkdir()File lugar:

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

Tenga en cuenta que mkdir() tiene dos modos de fallo independientes:

  1. "Si existe un administrador de seguridad y su método checkWrite() no permite que se cree el directorio nombrado" se lanzará un SecurityException.
  2. Si la operación falla por otro motivo, mkdir() devolverá falso. (Más específicamente, se devolverá verdadero si y sólo si se creó el directorio.)

punto 1 está bien - si no tiene permiso, a tiro. El punto 2 es un poco subóptimo por tres razones:

  1. Debe inspeccionar el resultado booleano de este método. Si ignora el resultado, la operación podría fallar silenciosamente.
  2. Si obtiene un retorno falso, no tiene idea de por qué falló la operación, lo que dificulta su recuperación, o formula un mensaje de error significativo.
  3. La terminología estricta de "si y solo si" del contrato también significa que el método devuelve falso si el directorio ya existe.

Aparte: Contraste El punto 3 con el comportamiento de la .NET Directory.CreateDirectory() cuales no hace nada si el directorio existe. Este tipo de sentido tiene sentido: "crear un directorio "; "ok, el directorio es creado". ¿Importa si fue creado ahora o antes; por este proceso u otro? Si realmente te importaba , ¿no estarías haciendo una pregunta diferente : "¿Existe este directorio?"

La siguiente advertencia es que mkdir() no creará más de un directorio a la vez. Para mi ejemplo simple de un directorio llamado "Foo", está bien; sin embargo, si desea crear un directorio llamado Bar dentro del directorio Foo (es decir, para crear el directorio "Foo/Bar"), debe recordar utilizar el método mkdirs().

Así que para evitar todas estas advertencias, se puede emplear un método de ayuda tales como los siguientes:

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

Has hecho una pregunta y publicado tu respuesta de inmediato? –

+5

Visto antes, la idea es que el usuario que publica la combinación pregunta + respuesta desea presentar una respuesta completa a alguna pregunta que puede parecer simple en un contexto que dirigirá a las personas que aún no saben cómo hacerlo a su propia respuesta. Perfectamente aceptable en mi opinión, aunque un poco confuso. – Esko

+1

Ah, entonces ahora sé cómo viene la parte "Blog" de la visión de Stackoverflow (http://sstatic.net/so/Img/stackoverflow-venn-diagram.png) :) – sfussenegger

1

que he visto en una forma un poco más concisa de su método de createDirectory:

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

También podría valer la pena comprobar si f existe, pero no es un directorio.

Cuestiones relacionadas