web-dev-qa-db-fra.com

Créer récursivement un répertoire

Est-ce que quelqu'un sait comment utiliser Java pour créer des sous-répertoires basés sur les alphabets (a-z) de n niveaux?

 /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
        ..
20
osley
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 crée de manière récurrente une arborescence de répertoires depth- level basée sur une liste donnée de Strings, qui, dans le cas de main, consiste en une liste de caractères de l'alphabet anglais.

2
João Silva

Vous pouvez simplement utiliser la méthode mkdirs () de la classe Java.io.File.

Exemple:

new File("C:\\Directory1\\Directory2").mkdirs();
106
Zhile Zou

Si cela ne vous dérange pas de faire appel à une API tierce, le paquet Apache Commons IO le fait directement pour vous. Jetez un coup d'oeil à FileUtils.ForceMkdir .

La licence Apache est adaptée au développement de logiciels commerciaux, c’est-à-dire qu’elle ne vous oblige pas à distribuer votre code source comme le fait la GPL. (Ce qui peut être une bonne ou une mauvaise chose, selon votre point de vue).

10
Rex

Groovy a la classe FileTreeBuilder pour cela. Le problème est que sa description est faible et que l'exemple comporte une erreur. Donc, je n'ai vu aucun code l'utiliser. Comme je l'ai constaté, cela ne fonctionnera pas correctement sans la définition du champ baseDir. Peut-être que cela résoudra vos problèmes.

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

C'est l'exemple de docs. Mais cela ne fonctionnera que si vous définissez en quelque sorte le baseDir. Par exemple, en passant par le paramètre constructeur.

0
Gangnus

Je voudrais écrire une petite méthode utilitaire qui prend la lettre de départ et la lettre de fin ainsi que la profondeur souhaitée en tant que paramètres. Cette méthode s'appelle récursivement jusqu'à la fin:

 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);
    }
  }

On l'appellerait comme ça:

createAlphabetFolders(new File("abctest"), 'A', 'E', 5);
0
Tim Büthe

Apache commons aborde la plupart de ces problèmes. Essayer -

org.Apache.commons.io.FileUtils.forceMkdir (répertoire);

0
Harsha

Code 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 _ =>  
        }
      }
    }
  }
0
matanster