0

如何访问以下 scala 代码中的文件名:

object FileMatcher {

  private def filesHere = (new java.io.File("c:\\")).listFiles

  def filesEnding(query: String) = 
    for (file <- filesHere; if file.getName.endsWith(query))
      yield file.getName

  def main(args: Array[String]) {
      println(filesEnding(".js"))  
    }

}

我有一个 .js 文件,输出为:[Ljava.io.File;@df8f5e

我尝试将 'yield file' 更改为 'yield file.getName' 但结果相同。

我假设 println(filesEnding(".js")) 调用 def 'filesEnding' 产生的任何 toString 方法,这是正确的吗?

4

3 回答 3

3

filesEnding产生一个Array[String](当你使用yield file.getNameArray[File]当你使用时yield filetoStringArray 的方法,是默认toString实现。这是打印的哈希码......这正是你得到的。您可能的意思是println(filesEnding(".js").mkString("\t","\n\t","\n"))哪个应该很好地打印您的文件。

于 2012-10-04T22:50:13.967 回答
1

File 上还有另一种方法可以减少您的工作,称为 list,它列出名称而不是 Files。根据您希望如何处理未找到搜索文件的情况,您可以处理抛出的异常或直接接收您想要的一个文件名:

val jsFile = new File("C:\\").list.find(_ endsWith ".js").head

或生成一个选项并通过以下方式避免异常:

val jsFileOpt = new File("C:\\").list.find(_ endsWith ".js").headOption

但是,如果您将非目录路径传递给 File 构造函数,这仍然会失败并出现异常。为了防止这种情况,将可能为空的列表包装在选项中。返回目录的内容后,您将获得 Option[Array[String]] 否则为 None。Find 将返回 Option[Option[String]],因此使用 flatMap 将此结果展平为 Option[String]。

val jsFileOpt = Option(new File("C:\\").list).flatMap(_.find(_ endsWith ".js"))

直接处理结果,忽略错误,使用上面的提取代码和map操作

Option(new File("C:\\").list).flatMap(_.find(_ endsWith ".js")) map {n =>
  // whatever you want to do with the file name.
}

调整您自己的代码不变,只提取返回数组中的第一个元素

filesEnding(".js").head 
于 2012-10-06T07:03:56.237 回答
0

在一个班轮中:

(new java.io.File("c:\\")).listFiles filter { _.getName.endsWith(query) } map { _.getName } foreach println

自然地,query用你想要的任何东西替换,或者把该行放在一个名为 query 的参数的 def 中。

于 2012-10-05T03:05:56.490 回答