2011-07-21 80 views
14

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

答えて

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 String秒の与えられたリストに基づいてdepthレベルのディレクトリツリーを作成し、 mainの場合、英字の文字のリストで構成されています。

0

あなたはそうのような文字a-zの上に3つのループを使用することができます。

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()を使用すると、再帰的なディレクトリ構造を作成したり、ネストされたループの各中間部分にディレクトリを作成することができます。私はそれをあなたのために終わらせておきます。

+0

Genius!別のqn:代わりに、ある種のアルファベットに制限したいのですが? – osley

+0

サブセットが連続している場合は、開始文字と終了文字を簡単に変更できます。文字セットが疎な場合は、文字配列を作成するのが最善でしょう。 'for '(int i = 0; i andyb

+0

説明できないdownvoteのおかげで4.5年後の – andyb

0

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

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

サードパーティのAPIに頼らない場合は、Apache Commons IOパッケージを使用してください。 FileUtils.ForceMkdirをご覧ください。

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

+0

実際の目的のためのはるかに最良の答え(i。e。それが教育的練習でない限り)。最も単純なアプリケーションでさえ、ビルドフレームワークを必要とするため、コマンドラインクラスパス、jarの位置などを管理する必要はありません。すべてのプログラマーは、早い段階でGradleを学ぶべきです。基本的な使い方は難しくありません。そして、いつもApache Commonsにぶつかって(そしてそれに慣れ親しんで)...決して輪を再構築しない。 –

87

java.io.Fileクラスのmkdirs()メソッドをそのまま使用できます。

+6

またはJava 7以降の 'Files.createDirectories' –

+1

この例では、答えが大きく見えるでしょう –

-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にはFileTreeBuilderクラスがあります。問題は、その記述が弱く、例にエラーがあることです。だから、私はそれを使用するコードを見たことがありません。私が見つけたように、それは正しく動作しませんbaseDirフィールドを設定せずに。多分、それはあなたの問題を解決するでしょう。

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

これはdocsの例です。しかし、あなたが何とかbaseDirを設定する場合にのみ動作します。たとえば、コンストラクターパラメーターを渡します。

0

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のは、ほとんどのこれらの対処します。試してください -

org.apache.commons.io.FileUtils.forceMkdir(ディレクトリ);

+2

これは手元の質問に対する回答ではないと私は考えています。 _How_この単一のメソッドは、要求されたことをしますか?問題はアルゴリズムについてであり、使用するAPIについてではありません。 – jdv

+0

@jdvどのようにしてこの質問がアルゴリズムでAPIではないと判断しましたか?質問自体にこのような記述はありません。 – KMP

+0

"... how to ..."しかし、私のコメントは実際には、いくつかの外部APIへの単一のリファレンスについては、良いSOの答えにしていません。 – jdv

関連する問題