本文介绍了Scala iteratee递归处理文件和子目录的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我要对目录和子目录中的每个文件应用一个函数,如下所示:
I want to apply a function for every file in a directory and subdirectories, as follows:
def applyRecursively(dir: String, fn: (File) => Any) {
def listAndProcess(dir: File) {
dir.listFiles match {
case null => out.println("exception: dir cannot be listed: " + dir.getPath); List[File]()
case files => files.toList.sortBy(_.getName).foreach(file => {
fn(file)
if (!java.nio.file.Files.isSymbolicLink(file.toPath) && file.isDirectory) listAndProcess(file)
})
}
}
listAndProcess(new File(dir))
}
def exampleFn(file: File) { println(s"processing $file") }
applyRecursively(dir, exampleFn)
这有效.这里的问题是我如何通过使用scala Iteratees重构此代码.像这样的东西:
this works. the question here is how I could refactor this code by using scala Iteratees. something like this:
val en = Enumerator.generateM(...) // ???
val it: Iteratee[File, Unit] = Iteratee.foreach(exampleFn)
val res = en.run(it)
res.onSuccess { case x => println("DONE") }
推荐答案
它不能捕获您的所有要求,但是可以帮助您入门
It does not capture all your requirements but this can get you started
object ExampleEnumerator {
import scala.concurrent.ExecutionContext.Implicits.global
def exampleFn(file: File) { println(s"processing $file") }
def listFiles(dir: File): Enumerator[File] = {
val files = Option(dir.listFiles).toList.flatten.sortBy(_.getName)
Enumerator(dir) andThen Enumerator(files :_*).flatMap(listFiles)
}
def main(args: Array[String]) {
import scala.concurrent.duration._
val dir = "."
val en: Enumerator[File] = listFiles(new File(dir))
val it: Iteratee[File, Unit] = Iteratee.foreach(exampleFn)
val res = en.run(it)
res.onSuccess { case x => println("DONE") }
Await.result(res, 10.seconds)
}
}
这篇关于Scala iteratee递归处理文件和子目录的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!