2017-11-14 8 views
1

特定の拡張子を持つすべてのファイルの一覧を特定のディレクトリ(およびそのサブディレクトリ)から取得しようとしています。代わりに、私は「.pipeline」拡張子を持つすべての外資企業を取得していますが、私は関数はファイルオブジェクト(リスト、配列の何でも)のリストを返したいとScalaのディレクトリの下に特定の拡張子を持つすべてのファイルを一覧表示します

var pipelineList: List[File] = Nil 

    private def getPipelines(dir: File): Unit = 
    { 
     val tmp = dir.listFiles(); 
     for (f <- tmp) { 
     if (f.isDirectory()) 
      getPipelines(f) 
     else if (f.isFile() && (f.getName.endsWith(".pipeline"))) { 
      pipelineList = pipelineList ::: List(f) 
     } 
     } 
    } 

これが働いている。これまでのところ、私がやっていること 外部リストを変更する。私はリストを宣言しようとしましたが、再帰呼び出しは毎回リストを再初期化し、結果リストをパラメータとして渡してみましたが、valに再割り当てできないということを何か追加しようとするとScalaはエラーをスローします。

はまた別の方法を試してみました:

def getListOfFiles(dir: File): Array[File] = { 
    val filesList= dir.listFiles 
    filesList ++ filesList.filter(_.isDirectory).flatMap(getListOfFiles) 
    filesList.filter(_.getName.endsWith(".pipeline")) 
} 

これが成功したディレクトリの下のすべてのファイルを取得しているが、述語が満足して取得するにもかかわらず、それは何も返さないだとして、フィルタが機能していません。

何か助けていただければ幸いです。

答えて

3
filesList ++ filesList.filter(_.isDirectory).flatMap(getListOfFiles) 

filesListを変更することなく、新しい不変アレイを返しています。だからあなたはする必要があります:

val res = filesList ++ filesList.filter(_.isDirectory).flatMap(getListOfFiles) 
res.filter(_.getName.endsWith(".pipeline")) 
+0

恐ろしい! ありがとうございました。 私はScalaを初めて使うので、私の無知を許してください。 'filesList ++ filesList.filter(_。isDirectory).flatMap(getListOfFiles)' は新しい不変の配列を返しますが、フィルタ関数は新しいコレクションを返します述語と一致する要素変更不可能な配列を変更しようとしません。右? – noobCoder

関連する問題