【问题标题】:List all files with specific extension beneath a directory in Scala列出Scala目录下具有特定扩展名的所有文件
【发布时间】:2018-04-27 01:18:28
【问题描述】:

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

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”扩展名的文件,但我希望该函数返回文件对象列表(列表、数组任何内容),而不是修改外部列表。我尝试在内部声明列表,但递归调用每次都重新初始化列表,还尝试将结果列表作为参数传递,但是当我尝试向其中添加任何内容时,Scala 会抛出错误,说它不能重新分配给 val。

还尝试了另一种方法:

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

这成功获取了目录下的所有文件,但过滤器不起作用,因为即使谓词得到满足,它也没有返回任何内容。

感谢任何帮助。

【问题讨论】:

    标签: scala file recursion directory subdirectory


    【解决方案1】:
    filesList ++ filesList.filter(_.isDirectory).flatMap(getListOfFiles)
    

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

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

    【讨论】:

    • 太棒了!谢谢。那行得通。我是 Scala 的新手,所以请原谅我的无知,filesList ++ filesList.filter(_.isDirectory).flatMap(getListOfFiles) 正在返回一个新的不可变数组,但过滤器函数返回一个新集合,其中的元素与谓词匹配。它不会尝试修改不可变数组。对吗?
    猜你喜欢
    • 2013-09-20
    • 1970-01-01
    • 2011-09-25
    • 2012-02-24
    • 1970-01-01
    • 1970-01-01
    • 2010-12-03
    • 2019-11-03
    • 2012-05-29
    相关资源
    最近更新 更多