2012-10-04 33 views
0

我怎样才能在访问下面Scala代码的文件名访问文件的名称:如何DIR

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方法,这是正确的吗?

+0

什么是_“相同的结果”_?顺便说一句,有一个'(''在'if'之后失踪... –

+0

@gilad hoch我认为在scala中if语句有一个隐式的开始和结束括号,它们是可选的。我更新了我的问题,输出结果是如果我使用括号作为if语句的一部分,也是一样的 –

+0

在REPL中尝试'if true 1 else 2',你会得到一个错误...所以'('&')'是必须的。当我添加它时,顺便说一句,顺便说一句,你是否指'println(filesEnding(“.js”).mkString(“\ t”,“\ n \ t”,“\ n”))?? –

回答

3

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

+1

或者交替使用filesEnding(“.js”)。foreach(println(_) )并对每个结果做一些事情 – jcern

0

在一个班轮:

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

当然,更换query用任何你想要的或放线的清晰度与论证命名查询。

1

还有另一种方法可以减少名为列表名称而不是文件名称的工作。根据您要如何处理,其中搜索到的文件中没有找到状态,您可以处理一个抛出的异常或直接接收要与一个文件名:

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

或产生一种选择,避免例外:

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

但是,如果您将非目录路径传递给File构造函数,这仍然会失败,并出现异常。到 的保护措施将可能为空的列表包装在选项中。随着导演的内容返回,你会得到一个选项[数组[字符串]],否则一个无。 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