Ausgabe
Gehen Sie in Ihrem Ressourcenordner von folgender Struktur aus:
resources
├─spec_A
| ├─AA
| | ├─file-aev
| | ├─file-oxa
| | ├─…
| | └─file-stl
| ├─BB
| | ├─file-hio
| | ├─file-nht
| | ├─…
| | └─file-22an
| └─…
├─spec_B
| ├─AA
| | ├─file-aev
| | ├─file-oxa
| | ├─…
| | └─file-stl
| ├─BB
| | ├─file-hio
| | ├─file-nht
| | ├─…
| | └─file-22an
| └─…
└─…
Die Aufgabe besteht darin, alle Dateien für eine bestimmte Spezifikation spec_X
einen Unterordner nach dem anderen zu lesen. Aus offensichtlichen Gründen möchten wir nicht die genauen Namen als Zeichenfolgenliterale haben, mit denen Source.fromResource("spec_A/AA/…")
Hunderte von Dateien im Code geöffnet werden können.
Außerdem sollte diese Lösung natürlich innerhalb der Entwicklungsumgebung laufen, dh ohne in ein JAR gepackt zu werden.
Lösung
Dank der Antwort von @TrebledJ könnte dies auf Folgendes minimiert werden:
class ConfigFiles (val basePath String) {
lazy val jarFileSystem: FileSystem = FileSystems.newFileSystem(getClass.getResource(basePath).toURI, Map[String, String]().asJava);
def listPathsFromResource(folder: String): List[Path] = {
Files.list(getPathForResource(folder))
.filter(p ⇒ Files.isRegularFile(p, Array[LinkOption](): _*))
.sorted.toList.asScala.toList // from Stream to java List to Scala Buffer to scala List
}
private def getPathForResource(filename: String) = {
val url = classOf[ConfigFiles].getResource(basePath + "/" + filename)
if ("file" == url.getProtocol) Paths.get(url.toURI)
else jarFileSystem.getPath(basePath, filename)
}
}
Besondere Aufmerksamkeit war für die leeren Einstellungskarten erforderlich.
Das Überprüfen des URL-Protokolls scheint unvermeidlich. Git aktualisiert, PUll-Anfragen willkommen: https://github.com/kurellajunior/list-files-from-resource-directory
Beantwortet von – Jan
Antwort geprüft von – Mary Flores (FixError Volunteer)