2011-07-21 16 views
14

Czy ktoś wie, jak używać języka Java do tworzenia podkatalogów na podstawie alfabetów (a-z) o głębokości n poziomów?Rekurencyjnie utworzyć katalog

/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 
     .. 

Odpowiedz

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 tworzy drzewo depth katalogów -level oparciu o danej listy String s, która w przypadku main, składa się z listy znaków w alfabecie angielskim.

0

Można użyć trzy pętle ciągu znaków a-z tak:

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

    } 
} 

To po prostu wyjść ścieżki do konsoli. Możesz użyć File#mkdirs(), aby utworzyć rekurencyjną strukturę katalogów lub utworzyć katalogi w każdej pośredniej części zagnieżdżonej pętli. Zostawię to, żebyś skończył.

+0

Geniusz! Kolejne pytanie: co jeśli zamiast tego chcę ograniczyć się do określonego zestawu alfabetów? – osley

+0

Jeśli podzbiór jest następujący po sobie, znaki początkowe i końcowe można łatwo zmienić. Jeśli jest to rzadki zestaw znaków, najlepiej jest utworzyć tablicę znaków, np. 'char [] alphabet = {'a', 'e', ​​'i', 'o', 'u'};' i zapętla to zamiast indeksu typu 'for (int i = 0; i andyb

+0

Dzięki za niewyjaśnione downvote 4.5 lat później – andyb

0

Chciałbym napisać małą metodę użytkową, która przyjmuje literę początkową i końcową, a także żądaną głębokość jako parametry. Metoda ta nazywa się rekurencyjnie do zrobienia:

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

Można by nazwać tak:

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

Jeśli nie masz nic przeciwko korzystaniu z interfejsu API innej firmy, pakiet Apache Commons IO robi to bezpośrednio dla Ciebie. Spójrz na FileUtils.ForceMkdir.

Licencja Apache jest przyjazna dla oprogramowania komercyjnego, tzn. Nie wymaga rozpowszechniania kodu źródłowego w sposób zgodny z warunkami licencji GPL. (Które może być dobre lub złe, w zależności od twojego punktu widzenia).

+0

Zdecydowanie najlepszą odpowiedzią dla celów praktycznych (I.mi. chyba że jest to ćwiczenie edukacyjne). I wymusza kwestię "kompilacji": nawet najprostsza aplikacja wymaga struktury kompilacji, aby nie musieć zarządzać ścieżkami klasy wiersza poleceń, lokalizacją słoików itp. Każdy programista powinien wcześnie uczyć się na Gradle: podstawowe użycie nie jest trudne. A potem zawsze dołączaj (i zapoznaj się) z Apache Commons ... nigdy nie wynajduj ponownie koła. –

87

Możesz po prostu użyć metody mkdirs() klasy java.io.File.

+6

Lub 'Files.createDirectories' od Javy 7 –

+1

Przykład, w którym można pójść dalej, sprawiłby, że odpowiedź wyglądałaby świetnie –

-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 ma dla niego klasę FileTreeBuilder. Problem polega na tym, że jego opis jest słaby, a przykładowy błąd. Tak więc, nie widziałem żadnego kodu z niego korzystającego. Jak znalazłem, nie będzie działał poprawnie bez ustawienia pola baseDir. Może to rozwiąże twoje problemy.

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

To jest przykład z dokumentów. Ale zadziała tylko wtedy, gdy ustawisz w jakiś sposób wartość baseDir. Na przykład, przechodząc przez parametr konstruktora.

0

kod 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 rozwiązuje większość z nich. Wypróbuj -

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

+2

Nie sądzę, że jest to odpowiedź na to pytanie. "W jaki sposób ta pojedyncza metoda robi to, o co prosi? Pytanie dotyczy algorytmu, a nie jakiego interfejsu API użyć. – jdv

+0

@jdv jak ustaliłeś, że to pytanie dotyczy algorytmu, a nie API, nie widzę żadnego takiego opisu w samym pytaniu. – KMP

+0

"... jak to zrobić ...", ale mój komentarz dotyczy pojedynczego odniesienia do niektórych zewnętrznych interfejsów API, które nie wpływają na dobrą odpowiedź WR. – jdv

Powiązane problemy