2011-07-21 10 views
14

¿Alguien sabe cómo usar Java para crear subdirectorios basados ​​en los alfabetos (a-z) que tienen n niveles de profundidad?Recursively create directory

/a 
    /a 
     /a 
     /b 
     /c 
     .. 
    /b 
     /a 
     /b 
     .. 
    .. 
     /a 
     /b 
     /c 
     .. 

/b 
    /a 
     /a 
     /b 
     .. 
    /b 
     /a 
     /b 
     .. 
    .. 
     /a 
     /b 
     .. 
.. 
    /a 
     /a 
     /b 
     .. 
    /b 
     /a 
     /b 
     .. 
    .. 
     /a 
     /b 
     .. 

Respuesta

4
public static void main(String[] args) { 
    File root = new File("C:\\SO"); 
    List<String> alphabet = new ArrayList<String>(); 
    for (int i = 0; i < 26; i++) { 
    alphabet.add(String.valueOf((char)('a' + i))); 
    } 

    final int depth = 3; 
    mkDirs(root, alphabet, depth); 
} 

public static void mkDirs(File root, List<String> dirs, int depth) { 
    if (depth == 0) return; 
    for (String s : dirs) { 
    File subdir = new File(root, s); 
    subdir.mkdir(); 
    mkDirs(subdir, dirs, depth - 1); 
    } 
} 

mkDirs recusively crea un árbol de directorios depth -level basado en una lista dada de String s, que, en el caso de main, consiste en una lista de caracteres en el alfabeto inglés.

0

Se puede usar más de tres bucles caracteres a-z así:

import java.io.*; 

public class FileCreate { 

    public static void main(String[] args) throws Exception { 
     char trunkDirectory = 'a'; 
     char branchDirectory = 'a'; 
     char leaf = 'a'; 

     while (trunkDirectory != '{') { 
      while (branchDirectory != '{') { 
       while (leaf != '{') { 
        System.out.println(trunkDirectory + "/" + branchDirectory + "/" + leaf++); 
       } 
       leaf = 'a'; 
       branchDirectory++; 
      } 
      branchDirectory = 'a'; 
      trunkDirectory++; 
     } 

    } 
} 

Esto simplemente da salida a las rutas de acceso a la consola. Puede usar File#mkdirs() para crear una estructura recursiva de directorios o crear los directorios en cada parte intermedia del ciclo anidado. Lo dejaré para que termines.

+0

Genius! Otro qn: ¿qué ocurre si quiero limitarme a un cierto conjunto de alfabetos? – osley

+0

Si el subconjunto es consecutivo, los caracteres iniciales y finales pueden cambiarse fácilmente. Si se trata de un conjunto escaso de caracteres, probablemente sea mejor crear una matriz de caracteres, p. 'char [] alphabet = {'a', 'e', ​​'i', 'o', 'u'};' y bucle que en su lugar con un índice como 'for (int i = 0; i andyb

+0

Gracias por el voto negativo inexplicado 4.5 años después – andyb

0

Escribo un pequeño método de utilidad que toma como parámetros la letra de inicio y la letra final, así como la profundidad deseada. Este método se llama de forma recursiva hasta hecho:

private static void createAlphabetFolders(File parent, int start, int end, int deepth){ 

    if(deepth <= 0){ 
     return; 
    } 

    for (int i=start; i < end; i++){ 

     // create the folder 
     String folderName = "" + ((char) i); 
     File folder = new File(parent, folderName); 
     System.out.println("creating: " + folder.getPath()); 
     folder.mkdirs(); 

     // call recursively 
     createAlphabetFolders(folder, start, end, deepth-1); 
    } 
    } 

Uno podría llamarlo así:

createAlphabetFolders(new File("abctest"), 'A', 'E', 5); 
10

Si no te importa depender de una API de un tercero, el paquete Apache Commons IO lo hace directamente por ti. Eche un vistazo al FileUtils.ForceMkdir.

La licencia de Apache es compatible con el desarrollo de software comercial, es decir, no requiere que distribuya su código fuente como lo hace la GPL. (Lo cual puede ser bueno o malo, según su punto de vista).

+0

Con mucho, la mejor respuesta para fines prácticos (i.mi. a menos que sea un ejercicio educativo). Y fuerza el problema de "compilación": incluso la aplicación más simple requiere un marco de compilación, para evitar tener que administrar classpaths de línea de comando, ubicación de jarras, etc. Todo programador debe aprender Gradle desde el principio: el uso básico no es difícil. Y luego siempre ingresas (y te familiarizas con) Apache Commons ... nunca reinventes la rueda. –

87

Puede simplemente usar el método mkdirs() de la clase java.io.File.

+6

O 'Files.createDirectories' desde Java 7 –

+1

Un ejemplo a seguir habría hecho que la respuesta se viera genial –

-1
// ensures parent directory is created 
    File parentFile = destFile.getParentFile(); 
    if (parentFile != null && !parentFile.exists()) { 
     parentFile.mkdirs(); 
    } 

    // creates destination file 
    if (!destFile.exists()) { 
     destFile.createNewFile(); 
    } 
0

Groovy tiene la clase FileTreeBuilder para él. El problema es que su descripción es débil y el ejemplo tiene un error. Entonces, no he visto ningún código usándolo. Como he encontrado, no funcionará correctamente sin configurar el campo baseDir. Tal vez, resolverá tus problemas.

def tree = new FileTreeBuilder() 
tree.src { 
    main { 
     groovy { 
      'Foo.groovy'('println "Hello"') 
     } 
    } 
    test { 
     groovy { 
      'FooTest.groovy'('class FooTest extends GroovyTestCase {}') 
     } 
    } 
} 

Este es el ejemplo de los documentos. Pero solo funcionará si configuras de alguna manera el disco base. Por ejemplo, al pasar por el parámetro constructor.

0

código Scala:

def makePathRecursive(path: String) = { 
    import java.io.File 
    import scala.util.{Try, Failure, Success} 

    val pathObj = new File(path) 
    pathObj.exists match { 
     case true => // do nothing 
     case false => Try(pathObj.mkdirs) match { 
     case Success(_) => // it worked 
     case Failure(e) => // maybe created meanwhile by another thread 
      pathObj.exists match { 
      case false => throw new Exception(e) 
      case _ => 
     } 
     } 
    } 
    } 
-1

Apache Commons ocupa la mayor parte de éstos. Pruebe -

org.apache.commons.io.FileUtils.forceMkdir (directorio);

+2

No creo que esta sea una respuesta a la pregunta en cuestión. _¿Cómo hace este único método para hacer lo que se solicita? La pregunta es sobre un algoritmo, no sobre qué API usar. – jdv

+0

@jdv, ¿cómo determinó que esta pregunta es sobre algoritmo y no una API, no veo ninguna descripción en la pregunta en sí misma. – KMP

+0

"... cómo ...", pero mi comentario es realmente acerca de una única referencia a una API externa que no ofrece una buena respuesta SO. – jdv