andrewoma
02/02/2016, 3:19 AMdata class TraversePaths(val roots: List<Path>, val traverseDirectoriesDown: Boolean = false, val traverseDirectoriesUp: Boolean = false, val traverseFiles: Boolean = true, val traverseLinks: Boolean = true, val traverseFailures: Boolean = false) {
fun <U> forEach(f: (Path) -> U) {
val visitor = object : SimpleFileVisitor<Path>() {
override fun preVisitDirectory(path: Path, attrs: BasicFileAttributes): FileVisitResult {
if (traverseDirectoriesDown) f(path)
return CONTINUE
}
override fun postVisitDirectory(path: Path, e: IOException?): FileVisitResult {
if (traverseDirectoriesUp) f(path)
return CONTINUE
}
override fun visitFileFailed(path: Path, e: IOException?): FileVisitResult {
if (traverseFailures) f(path)
return CONTINUE
}
override fun visitFile(path: Path, attrs: BasicFileAttributes): FileVisitResult {
if (traverseFiles) f(path)
return CONTINUE
}
}
if (traverseLinks)
roots.forEach { Files.walkFileTree(it, EnumSet.of(FileVisitOption.FOLLOW_LINKS), Integer.MAX_VALUE, visitor) }
else
roots.forEach { Files.walkFileTree(it, visitor) }
}
}
fun main(args: Array<String>) {
TraversePaths(listOf(Paths.get("/"))).forEach { file ->
println(file)
}
}