web-dev-qa-db-ja.com

再帰的にディレクトリを作成

Javaを使用して、nレベルの深さのアルファベット(a-z)に基づいてサブディレクトリを作成する方法を知っていますか?

 /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
        ..
22
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は、指定されたdepthsのリストに基づいてStringレベルのディレクトリツリーを作成します。これは、mainの場合、英語のアルファベットの文字のリストで構成されます。

2
João Silva

単純にJava.io.Fileクラスの mkdirs() メソッドを使用できます。

例:

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

サードパーティのAPIに依存することを気にしない場合、 Apache Commons IO パッケージがこれを直接行います。 FileUtils.ForceMkdir を見てください。

Apacheライセンスは商用ソフトウェア開発に適しています。つまり、GPLのようにソースコードを配布する必要はありません。 (あなたの視点に応じて、良いことも悪いこともあります)。

11
Rex

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
Gangnus

パラメータとして希望する深さだけでなく、開始文字と終了文字を受け取る小さなユーティリティメソッドを作成します。このメソッドは、完了するまで再帰的に自分自身を呼び出します。

 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
Tim Büthe

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