列出Scala中目录下具有特定扩展名的所有文件

时间:2017-11-14 07:23:50

标签: scala file recursion directory subdirectory

我正在尝试从给定目录(及其子目录)中获取具有给定扩展名的所有文件的列表。 到目前为止我做了什么:

var pipelineList: List[File] = Nil

  private def getPipelines(dir: File): Unit =
    {
      val tmp = dir.listFiles();
      for (f <- tmp) {
        if (f.isDirectory())
          getPipelines(f)
        else if (f.isFile() && (f.getName.endsWith(".pipeline"))) {
          pipelineList = pipelineList ::: List(f)
        }
      }
    }

这是有效的,因为我正在使用“.pipeline”扩展获得所有fies,但我希望该函数返回File对象列表(List,Array any)而不是修改外部列表。我尝试在内部声明列表,但递归调用每次重新初始化列表,也尝试将结果列表作为参数传递,但当我尝试向其添加任何内容时,Scala会抛出错误,说它无法重新分配给val。

还尝试了另一种方式:

def getListOfFiles(dir: File): Array[File] = {
    val filesList= dir.listFiles
    filesList ++ filesList.filter(_.isDirectory).flatMap(getListOfFiles)
    filesList.filter(_.getName.endsWith(".pipeline"))
}

这是成功获取目录下的所有文件,但过滤器无法正常工作,因为即使谓词得到满足,它也不会返回任何内容。

感谢任何帮助。

1 个答案:

答案 0 :(得分:3)

filesList ++ filesList.filter(_.isDirectory).flatMap(getListOfFiles)

返回新的不可变数组而不更改filesList。所以你需要:

val res = filesList ++ filesList.filter(_.isDirectory).flatMap(getListOfFiles)
res.filter(_.getName.endsWith(".pipeline"))