2012-10-04 27 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