ファイル一覧

あるディレクトリ以下のファイル一覧を作らなきゃいけなくなったのでgroovyでスクリプトを書いた。
必要なのは、ディレクトリ構造、ファイル名、更新日付。
ずっとに一度作ったのをベースにしてたんだけど、どんどん直したくなっちゃって結局全然ちがくなっちゃった。
メインはこんなの

import java.io.File
import java.text.SimpleDateFormat
import java.util.Date

// mainパラメータ解析
arguments = MapUtil.arraysToMap(['root', 'output'], args, ['.', 'directory.txt'])
println(arguments)

// 更新日付フォーマット
dateFormat = new SimpleDateFormat('yyyy/MM/dd H:mm')
def formatLastModified(file) {
	return dateFormat.format(new Date(file.lastModified()))
}

// ディレクトリツリー出力
new File(arguments.get('output')).withWriter { writer |
	root = new File(arguments.get('root'))
	rootDepth = FileUtil.getDepth(root)
	writer.writeLine "+-${root.name}"
	
	root.eachFileRecurse { file |
		indent = '|  ' * (FileUtil.getDepth(file) - rootDepth)
		if (file.file) {
			writer.writeLine "${indent}\t${file.name}\t\t${formatLastModified(file)}"
		}
		if (file.directory) {
			writer.writeLine "${indent}+-${file.name}"
		}
	}
}

ユーティリティがこれ

import java.util.HashMap

class MapUtil {
	static arraysToMap(names, values, defaults) {
		map = new HashMap();
		putAll(map, names, defaults)
		putAll(map, names, values)
		return map
	}
	
	static putAll(map, names, values) {
		size = Math.min(names.size(), values.size())
		if (size == 0) return
		for (i in 0...size) {
			if (values[i] != null) {
				map.put(names[i], values[i])
			}
		}
	}
}
class FileUtil {
	static getDepth(file) {
		if (file.parent != null) {
			return getDepth(file.parentFile) + 1
		} else {
			return 0
		}
	}
}

ユーティリティのメソッドは元のクラスにMixinしたかったんだけど、結局やり方がわかんなかった。
だいぶJavaっぽくなっちゃったな。