【问题标题】:How to access name of files in dir如何访问目录中的文件名
【发布时间】:2012-10-06 17:54:40
【问题描述】:

如何在下面的 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 方法,这是正确的吗?

【问题讨论】:

  • 什么是“相同的结果”?顺便说一句,在if 之后缺少(...
  • @gilad hoch 我认为 scala 中的 if 语句有一个隐式的左括号和右括号,它们是可选的。我已经更新了我的问题,如果我使用括号作为 if 语句的一部分,输出是相同的
  • 在 REPL 中尝试if true 1 else 2。你会得到一个错误......所以()是必须的。当我添加它时为我工作。顺便说一句,你的意思是println(filesEnding(".js").mkString("\t","\n\t","\n"))
  • @gilad hoch 是的,但为什么'yield file.getName'不起作用?
  • @gilad hoch ive 我尝试在 if 语句周围加上括号,但不起作用

标签: scala


【解决方案1】:

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

【讨论】:

  • 或交替使用 filesEnding(".js").foreach(println(_)) 并对每个结果进行处理
【解决方案2】:

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

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"))

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

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

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

filesEnding(".js").head 

【讨论】:

    【解决方案3】:

    在一个班轮中:

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

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

    【讨论】:

      猜你喜欢
      • 2015-07-24
      • 2012-10-11
      • 1970-01-01
      • 1970-01-01
      • 2021-03-11
      • 1970-01-01
      • 1970-01-01
      • 2017-01-06
      相关资源
      最近更新 更多