ディレクトリ構造を書き出してみる
昨日Mavenを試していて、にっきに載せるときはディレクトリ構造を手で書いていた。↓こんなやつ
また同じようなの書くこともあるかもしれないのでスクリプト作っとこう。今はやりのGroovyで挑戦だ〜。
directory/
+--file1.txt
+--file2.txt
...
かなり苦戦。
FileはConpositeパターンになってるんだからVisitorでやるか?でもスクリプトだしもっとシンプルにできないかな?やっぱりClosure使ったほうがかっこいいよな。
といろいろ考えながらいじりまくった挙句、こんなところに落ち着きました。
DirectoryScannerにディレクトリ構造を辿らせて、見つけたディレクトリまたはファイルをどうするかはClosureで書くと。やっぱりClosure使うとソースがシンプルで読みやすいね〜。
import java.io.FilerootPath = args.size() > 0 ? args[0] : '.'
outputPath = args.size() > 1 ? args[1] : 'directories.txt'new File(outputPath).withWriter { writer |
new DirectoryScanner(rootPath).eachFileRecurse { depth, file |
indent = ' ' * depth
mark = file.isDirectory() ? '/' : ''
writer.writeLine "${indent}+--${file.name}${mark}"
}
}class DirectoryScanner {
depth = 0
directory
DirectoryScanner(path) {
this.directory = new File(path).getCanonicalFile()
}
void eachFileRecurse(closure) {
eachFileRecurse(directory, closure)
}
void eachFileRecurse(file, closure) {
closure(depth, file)
if (file.isDirectory()) {
depth++
file.eachFile {
eachFileRecurse(it, closure)
}
depth--
}
}
}
でもちょっと気になるのがコマンドライン引数の値を取得するとこ。足りないときの処理が書きづらかった。配列でOutOfBoundsExceptionを回避してデフォルト値を使うような仕組みが欲しくなったけど、この場合にしか使わないかもなぁ。
Groovyはかなり楽しいのでもっと使ってみたくなってきた。なんか思いついたらどんどん使っていこう。