Рекурсивно создать каталог

Кто-нибудь знает, как использовать Java для создания подкаталогов на основе алфавитов (a-z), содержащих n уровней?

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

Ответы

Ответ 1

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 создает дерево каталогов depth на основе заданного списка String s, которое в случае main состоит из списка символов в английском алфавите.

Ответ 2

Вы можете просто использовать метод mkdirs() класса java.io.File.

Ответ 3

Если вы не против полагаться на сторонний API, пакет Apache Commons IO делает это прямо для вас. Посмотрите FileUtils.ForceMkdir.

Лицензия Apache - это коммерческая разработка программного обеспечения, то есть она не требует, чтобы вы распространяли исходный код так, как это делает GPL. (Что может быть хорошим или плохим, в зависимости от вашей точки зрения).

Ответ 4

Вы можете использовать три петли над символами a-z следующим образом:

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

    }
}

Это просто выводит пути к консоли. Вы можете использовать File#mkdirs() для создания рекурсивной структуры каталогов или создания каталогов в каждой промежуточной части вложенного цикла. Я оставлю это для вас, чтобы закончить.

Ответ 5

Я бы написал небольшой полезный метод, который принимает начальную и конечную буквы, а также желаемую глубину в качестве параметров. Этот метод называет себя рекурсивно до завершения:

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

Можно было бы назвать это следующим образом:

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

Ответ 6

Groovy имеет для этого класс FileTreeBuilder. Проблема в том, что его описание слабое, и пример имеет ошибку. Таким образом, я не видел никакого кода, использующего его. Как я нашел, он не будет работать правильно, не устанавливая поле baseDir. Возможно, это решит ваши проблемы.

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

Это пример из документов. Но он будет работать, только если вы каким-то образом установите baseDir. Например, пройдя через параметр конструктора.

Ответ 7

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 _ =>  
        }
      }
    }
  }

Ответ 8

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

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

Ответ 9

Общее количество сообщений Apache адресовано большинству из них. Попробуйте -

org.apache.commons.io.FileUtils.forceMkdir(каталог);