Рекурсивно создать каталог - PullRequest
22 голосов
/ 21 июля 2011

Кто-нибудь знает, как использовать 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
        ..

Ответы [ 9 ]

114 голосов
/ 03 декабря 2012

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

Пример:

new File("C:\\Directory1\\Directory2").mkdirs();
11 голосов
/ 28 декабря 2011

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

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

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

0 голосов
/ 05 октября 2017

Apache Commons адресует большинство из них Попробуй -

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

0 голосов
/ 31 марта 2016

Скала код:

  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 голосов
/ 23 октября 2015

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

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

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

0 голосов
/ 20 июня 2015
    // 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 голосов
/ 21 июля 2011

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

 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);
0 голосов
/ 21 июля 2011

Вы можете использовать три цикла над символами 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() для создания рекурсивной структуры каталогов или создания каталогов в каждой промежуточной части вложенного цикла.Я оставлю это для вас, чтобы закончить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...