Le code Scala utilise généralement des classes Java pour gérer les E / S, y compris la lecture des répertoires. Vous devez donc faire quelque chose comme:
import java.io.File
def recursiveListFiles(f: File): Array[File] = {
val these = f.listFiles
these ++ these.filter(_.isDirectory).flatMap(recursiveListFiles)
}
Vous pouvez collecter tous les fichiers, puis filtrer à l'aide d'une expression régulière:
myBigFileArray.filter(f => """.*\.html$""".r.findFirstIn(f.getName).isDefined)
Ou vous pouvez incorporer l'expression régulière dans la recherche récursive:
import scala.util.matching.Regex
def recursiveListFiles(f: File, r: Regex): Array[File] = {
val these = f.listFiles
val good = these.filter(f => r.findFirstIn(f.getName).isDefined)
good ++ these.filter(_.isDirectory).flatMap(recursiveListFiles(_,r))
}
listFiles
renvoienull
sif
ne pointe pas vers un répertoire ou s'il y a une erreur IO (au moins selon la spécification Java). L'ajout d'une vérification nulle est probablement judicieux pour une utilisation en production.f.isDirectory
de retourner vrai maisf.listFiles
de retournernull
. Par exemple, si vous n'êtes pas autorisé à lire les fichiers, vous obtiendrez unnull
. Plutôt que d'avoir les deux chèques, j'ajouterais simplement le chèque nul.f.listFiles
renvoie null quand!f.isDirectory
.Je préférerais une solution avec Streams car vous pouvez itérer sur un système de fichiers infini (les Streams sont des collections évaluées paresseusement)
Exemple de recherche
la source
def getFileTree(f: File): Stream[File] = f #:: Option(f.listFiles()).toStream.flatten.flatMap(getFileTree)
Depuis Java 1.7, vous devriez tous utiliser java.nio. Il offre des performances proches du natif (java.io est très lent) et a quelques aides utiles
Mais Java 1.8 présente exactement ce que vous recherchez:
Vous avez également demandé une correspondance de fichiers. Essayez
java.nio.file.Files.find
et aussijava.nio.file.Files.newDirectoryStream
Voir la documentation ici: http://docs.oracle.com/javase/tutorial/essential/io/walk.html
la source
http://langref.org/scala+java/files
la source
Scala est un langage multi-paradigme. Une bonne manière "scala-esque" d'itérer un répertoire serait de réutiliser un code existant!
J'envisagerais d' utiliser commons-io une manière parfaitement scala-esque d'itérer un répertoire. Vous pouvez utiliser certaines conversions implicites pour faciliter les choses. Comme
la source
J'aime la solution de flux de yura, mais elle (et les autres) récurent dans des répertoires cachés. Nous pouvons également simplifier en utilisant le fait que
listFiles
renvoie null pour un non-répertoire.Maintenant, nous pouvons lister les fichiers
ou réalisez le flux entier pour un traitement ultérieur
la source
FileUtils d' Apache Commons Io tient sur une seule ligne et est assez lisible:
la source
Personne n'a encore mentionné https://github.com/pathikrit/better-files
la source
Jetez un œil à scala.tools.nsc.io
Il existe des utilitaires très utiles, y compris une fonctionnalité de liste détaillée dans la classe Directory.
Si je me souviens bien, cela a été mis en évidence (peut-être contribué) par retronym et a été considéré comme un palliatif avant que io n'obtienne une implémentation fraîche et plus complète dans la bibliothèque standard.
la source
Et voici un mélange de la solution de flux de @DuncanMcGregor avec le filtre de @ Rick-777:
Cela vous donne un Stream [File] au lieu d'un List [File] (potentiellement énorme et très lent) tout en vous laissant décider dans quels types de répertoires la fonction descendCheck () doit être récurée.
la source
Que diriez-vous
la source
Scala a la bibliothèque 'scala.reflect.io' qui est considérée comme expérimentale mais fait le travail
la source
J'aime personnellement l'élégance et la simplicité de la solution proposée par @Rex Kerr. Mais voici à quoi pourrait ressembler une version récursive de queue:
la source
Voici une solution similaire à celle de Rex Kerr, mais intégrant un filtre de fichiers:
La méthode renvoie un List [File], ce qui est légèrement plus pratique que Array [File]. Il ignore également tous les répertoires masqués (c'est-à-dire commençant par «.»).
Il est partiellement appliqué à l'aide d'un filtre de fichier de votre choix, par exemple:
la source
La solution la plus simple pour Scala uniquement (si cela ne vous dérange pas d'exiger la bibliothèque de compilateur Scala):
Sinon, la solution de @ Renaud est courte et douce (si cela ne vous dérange pas de tirer dans Apache Commons FileUtils):
Où
dir
est un fichier java.io.File:la source
Il semble que personne ne mentionne la
scala-io
bibliothèque de scala-incubrator ...Ou avec
implicit
Ou si vous voulez
implicit
explicitement ...La documentation est disponible ici: http://jesseeichar.github.io/scala-io-doc/0.4.3/index.html#!/file/glob_based_path_sets
la source
Cette incantation fonctionne pour moi:
la source
Vous pouvez utiliser la récursivité de queue pour cela:
la source
Pourquoi utilisez-vous le fichier Java au lieu du AbstractFile de Scala?
Avec AbstractFile de Scala, la prise en charge des itérateurs permet d'écrire une version plus concise de la solution de James Moore:
la source