web-dev-qa-db-ger.com

Verzeichnis rekursiv erstellen

Weiß jemand, wie mit Java Unterverzeichnisse erstellt werden, die auf den Alphabeten (a-z) basieren, die n Ebenen tief sind?

 /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 erstellt rekursiv eine depth-Level-Verzeichnisstruktur basierend auf einer gegebenen Liste von Strings, die im Fall von main aus einer Liste von Zeichen im englischen Alphabet besteht.

2
João Silva

Sie können einfach die mkdirs () - Methode der Klasse Java.io.File verwenden.

Beispiel:

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

Wenn Sie nichts dagegen haben, sich auf eine API eines Drittanbieters zu verlassen, erledigt das Paket Apache Commons IO dies direkt für Sie. Werfen Sie einen Blick auf FileUtils.ForceMkdir .

Die Apache-Lizenz ist für die kommerzielle Entwicklung von Software geeignet, d. H., Sie müssen Ihren Quellcode nicht wie die GPL verteilen. (Was je nach Standpunkt eine gute oder eine schlechte Sache sein kann).

10
Rex

Groovy hat dafür die FileTreeBuilder-Klasse. Das Problem ist, dass die Beschreibung schwach ist und ein Beispiel fehlerhaft ist. Ich habe also keinen Code gesehen, der ihn benutzt. Wie ich herausgefunden habe, funktioniert es nicht korrekt, ohne das Feld baseDir einzustellen. Vielleicht löst es Ihre Probleme.

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

Das ist das Beispiel aus docs. Aber es funktioniert nur, wenn Sie das baseDir irgendwie einstellen. Zum Beispiel durch Übergeben des Konstruktorparameters.

0
Gangnus

Ich würde eine kleine Methode schreiben, die den Anfangs- und den Endbuchstaben sowie die gewünschte Tiefe als Parameter enthält. Diese Methode ruft sich selbst rekursiv auf:

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

Man würde es so nennen:

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

Apache Commons spricht die meisten davon an. Versuchen -

org.Apache.commons.io.FileUtils.forceMkdir (Verzeichnis);

0
Harsha

Scala-Code:

  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