2017-11-14 1 views
1

Ich versuche eine Liste aller Dateien mit einer bestimmten Erweiterung aus einem bestimmten Verzeichnis (und seinen Unterverzeichnissen) zu bekommen. Bisher was ich getan habe:Listet alle Dateien mit spezifischer Erweiterung unter einem Verzeichnis in Scala auf

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

Dies funktioniert, wie ich alle fies mit „.pipeline“ -Erweiterung bin immer, aber ich möchte, dass die Funktion eine Liste von File-Objekten (List, Array etwas) statt zurückzukehren eine externe Liste zu ändern. Ich habe versucht, die Liste zu deklarieren, aber die rekursiven Aufrufe initialisieren die Liste jedes Mal, versuchten auch, die Ergebnisliste als Parameter zu übergeben, aber Scala gibt einen Fehler aus, wenn ich versuche, etwas hinzuzufügen, dass es nicht auf val umstellen kann.

auch versucht, einen anderen Weg:

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

Das alles erfolgreich wird immer die Dateien unter dem Verzeichnis, aber der Filter funktioniert nicht, da es nicht ist etwas zurückkehr obwohl das Prädikat erfüllt wird.

Jede Hilfe wird geschätzt.

Antwort

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

kehrt ein neues Immutable Array ohne die filesList zu ändern. so müssen Sie:

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

Super! Danke. Das hat funktioniert. Ich bin neu in Scala also bitte vergib meine Unwissenheit, 'filesList ++ filesList.filter (_. IsDirectory) .flatMap (getListOfFiles)' gibt ein neues unveränderliches Array zurück, aber die Filterfunktion gibt eine neue Sammlung mit der Elemente, die dem Prädikat entsprechen. Es versucht nicht, das unveränderliche Array zu ändern. Recht? – noobCoder

Verwandte Themen