El código de Scala generalmente usa clases de Java para tratar con E / S, incluida la lectura de directorios. Entonces tienes que hacer algo como:
import java.io.File
def recursiveListFiles(f: File): Array[File] = {
val these = f.listFiles
these ++ these.filter(_.isDirectory).flatMap(recursiveListFiles)
}
Puede recopilar todos los archivos y luego filtrar usando una expresión regular:
myBigFileArray.filter(f => """.*\.html$""".r.findFirstIn(f.getName).isDefined)
O puede incorporar la expresión regular en la búsqueda recursiva:
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
devuelvenull
sif
no apunta a un directorio o si hay un error de IO (al menos de acuerdo con las especificaciones de Java). Agregar un cheque nulo probablemente sea conveniente para el uso de producción.f.isDirectory
devolver verdadero perof.listFiles
regresarnull
. Por ejemplo, si no tiene permiso para leer los archivos, obtendrá unnull
. En lugar de tener ambos controles, simplemente agregaría el único control nulo.f.listFiles
devuelve nulo cuando!f.isDirectory
.Preferiría una solución con Streams porque puede iterar sobre un sistema de archivos infinito (los Streams son colecciones evaluadas de forma perezosa)
Ejemplo de búsqueda
fuente
def getFileTree(f: File): Stream[File] = f #:: Option(f.listFiles()).toStream.flatten.flatMap(getFileTree)
A partir de Java 1.7, todos deberían usar java.nio. Ofrece un rendimiento cercano al nativo (java.io es muy lento) y tiene algunos ayudantes útiles
Pero Java 1.8 presenta exactamente lo que está buscando:
También solicitó la coincidencia de archivos. Prueba
java.nio.file.Files.find
y tambiénjava.nio.file.Files.newDirectoryStream
Consulte la documentación aquí: http://docs.oracle.com/javase/tutorial/essential/io/walk.html
fuente
http://langref.org/scala+java/files
fuente
Scala es un lenguaje de múltiples paradigmas. Una buena forma "scala-esque" de iterar un directorio sería reutilizar un código existente.
Consideraría usar commons-io como una forma perfectamente escalada de iterar un directorio. Puede usar algunas conversiones implícitas para hacerlo más fácil. Me gusta
fuente
Me gusta la solución de flujo de yura, pero (y las demás) recurre a directorios ocultos. También podemos simplificar haciendo uso del hecho de que
listFiles
devuelve nulo para un no directorio.Ahora podemos listar archivos
o realizar todo el flujo para su posterior procesamiento
fuente
FileUtils de Apache Commons Io cabe en una línea y es bastante legible:
fuente
Nadie ha mencionado todavía https://github.com/pathikrit/better-files
fuente
Eche un vistazo a scala.tools.nsc.io
Hay algunas utilidades muy útiles que incluyen la funcionalidad de listado profundo en la clase Directory.
Si mal no recuerdo, esto fue resaltado (posiblemente contribuido) por retronym y fue visto como una solución provisional antes de que io obtenga una implementación nueva y más completa en la biblioteca estándar.
fuente
Y aquí hay una mezcla de la solución de flujo de @DuncanMcGregor con el filtro de @ Rick-777:
Esto le da un [Archivo] de Flujo en lugar de un [Archivo] Lista (potencialmente enorme y muy lento) mientras le permite decidir en qué tipo de directorios recurrir con la función descenCheck ().
fuente
Qué tal si
fuente
Scala tiene la biblioteca 'scala.reflect.io' que se considera experimental pero hace el trabajo
fuente
Personalmente, me gusta la elegancia y simplicidad de la solución propuesta por @Rex Kerr. Pero así es como se vería una versión recursiva de cola:
fuente
Aquí hay una solución similar a la de Rex Kerr, pero que incorpora un filtro de archivo:
El método devuelve un List [File], que es un poco más conveniente que Array [File]. También ignora todos los directorios que están ocultos (es decir, que comienzan con '.').
Se aplica parcialmente usando un filtro de archivo de su elección, por ejemplo:
fuente
La solución más simple solo para Scala (si no le importa requerir la biblioteca del compilador de Scala):
De lo contrario, la solución de @ Renaud es breve y sencilla (si no le importa extraer Apache Commons FileUtils):
¿Dónde
dir
está un archivo java.io.:fuente
Parece que nadie menciona la
scala-io
biblioteca de scala-incubrator ...O con
implicit
O si quieres
implicit
explícitamente ...La documentación está disponible aquí: http://jesseeichar.github.io/scala-io-doc/0.4.3/index.html#!/file/glob_based_path_sets
fuente
Este encantamiento funciona para mí:
fuente
Puede usar la recursividad de cola para ello:
fuente
¿Por qué está utilizando el archivo de Java en lugar del AbstractFile de Scala?
Con AbstractFile de Scala, el soporte del iterador permite escribir una versión más concisa de la solución de James Moore:
fuente