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
..
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
sのリストに基づいてString
レベルのディレクトリツリーを作成します。これは、main
の場合、英語のアルファベットの文字のリストで構成されます。
サードパーティのAPIに依存することを気にしない場合、 Apache Commons IO パッケージがこれを直接行います。 FileUtils.ForceMkdir を見てください。
Apacheライセンスは商用ソフトウェア開発に適しています。つまり、GPLのようにソースコードを配布する必要はありません。 (あなたの視点に応じて、良いことも悪いこともあります)。
GroovyにはFileTreeBuilderクラスがあります。問題は、その説明が弱く、例に誤りがあることです。したがって、それを使用するコードは見ていません。私が見つけたように、baseDirフィールドを設定しないと正しく動作しません。たぶん、それはあなたの問題を解決するでしょう。
def tree = new FileTreeBuilder()
tree.src {
main {
groovy {
'Foo.groovy'('println "Hello"')
}
}
test {
groovy {
'FooTest.groovy'('class FooTest extends GroovyTestCase {}')
}
}
}
それがドキュメントの例です。ただし、何らかの方法でbaseDirを設定する場合にのみ機能します。たとえば、コンストラクターパラメーターを渡すことによって。
パラメータとして希望する深さだけでなく、開始文字と終了文字を受け取る小さなユーティリティメソッドを作成します。このメソッドは、完了するまで再帰的に自分自身を呼び出します。
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);
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 _ =>
}
}
}
}