在Scala中查找与通配符String匹配的文件

elm*_*elm 7 scala file wildcard scala-collections

如何获取Array[io.BufferedSource]与给定目录中的通配符匹配的所有文件?

即,如何定义的方法io.Source.fromDir,使得

val txtFiles: Array[io.BufferedSource] = io.Source.fromDir("myDir/*.txt") // ???
Run Code Online (Sandbox Code Playgroud)

注意到文件实用程序阿帕奇百科全书IO,但非常优选是没有外部依赖性Scala的API为基础的方法.

som*_*ytt 7

scala> import reflect.io._, Path._
import reflect.io._
import Path._

scala> val r = """.*\.scala""".r
r: scala.util.matching.Regex = .*\.scala

scala> "/home/amarki/tmp".toDirectory.files map (_.name) flatMap { case n @ r() => Some(n) case _ => None }
res0: Iterator[String] = non-empty iterator

scala> .toList
res1: List[String] = List(bobsrandom.scala, ...)
Run Code Online (Sandbox Code Playgroud)

或递归

scala> import PartialFunction.{ cond => when }
import PartialFunction.{cond=>when}

scala> "/home/amarki/tmp" walkFilter (p => p.isDirectory || when(p.name) {
     | case r() => true })
res3: Iterator[scala.reflect.io.Path] = non-empty iterator
Run Code Online (Sandbox Code Playgroud)


Max*_*axU 5

这是基于@som-snytt 的这个很棒的答案的答案

scala> import reflect.io._, Path._
import reflect.io._
import Path._

scala> "/temp".toDirectory.files.map(_.path).filter(name => name matches """.*\.xlsx""")
res2: Iterator[String] = non-empty iterator
Run Code Online (Sandbox Code Playgroud)

作为数组:

scala> "/temp".toDirectory.files.map(_.path).filter(name => name matches """.*\.xlsx""").toArray
res3: Array[String] = Array(/temp/1.xlsx, /temp/2.xlsx, /temp/3.xlsx, /temp/a.1.xlsx, /temp/Book1.xlsx, /temp/new.xlsx)
Run Code Online (Sandbox Code Playgroud)