如何在dir中访问文件的名称

时间:2012-10-04 22:14:37

标签: scala

如何在下面的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”))调用了'filesEnding'产生的toString方法,这是正确的吗?

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分: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中的潜在空列表。如果返回了directorie的内容,则会获得Option [Array [String]],否则为None。 Find将返回Option [Option [String]],因此请使用flatMap 将此结果展平回选项[String]。

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

要直接处理结果,忽略错误,请将上述提取代码与地图操作一起使用

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

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

filesEnding(".js").head 

答案 2 :(得分:0)

在一个班轮中:

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

当然,将query替换为您想要的任何内容,或者将该行放在带有名为query的参数的def中。