examples dependency dependencia commons java apache-commons-io

java - dependency - Búsqueda recursiva solo de directorios con FileUtils.listFiles



dependencia commons io (6)

Quiero recopilar una lista de todos los archivos en un directorio, en particular, incluidos los subdirectorios. No me gusta hacer cosas por mí mismo, así que estoy usando FileUtils.listFiles de Apache Commons IO. Así que tengo algo como:

import java.io.File; import java.util.Collection; import org.apache.commons.io.FileUtils; import org.apache.commons.io.filefilter.TrueFileFilter; public class TestListFiles { public static void main(String[] args) { Collection<File> found = FileUtils.listFiles(new File("foo"), TrueFileFilter.INSTANCE, TrueFileFilter.INSTANCE); for (File f : found) { System.out.println("Found file: " + f); } } }

El problema es que esto solo parece encontrar archivos normales, no directorios:

$ mkdir -p foo/bar/baz; touch foo/one_file $ java -classpath commons-io-1.4.jar:. TestListFiles Found file: foo/one_file

Ya estoy pasando TrueFileFilter a ambos filtros, por lo que no puedo pensar en nada más inclusivo. Quiero que "foo", "foo/one_file", "foo/bar", "foo/bar/baz" : "foo", "foo/one_file", "foo/bar", "foo/bar/baz" (en cualquier orden).

También aceptaría soluciones que no sean de FileUtils , pero parece una tontería tener que escribir mi propio BFS, o incluso recopilar el conjunto de directorios principales de la lista que obtengo. (De todos modos, eso faltaría a los subdirectorios vacíos). Esto está en Linux, FWIW.


¿Has intentado simplemente:

File rootFolder = new File(...); File[] folders = rootFolder.listFiles((FileFilter) FileFilterUtils.directoryFileFilter());

Parece que funciona para mí. Necesitarás recursión, por supuesto.

Espero eso ayude.


Debería funcionar, basado en su API.

Aquí está mi propia versión de FileUtils , no tan completa como Commons IO, contiene solo lo que necesito. Busque findFiles o puede usar iterar para evitar la creación de listas enormes (en algún momento / la mayoría de las veces, solo desea hacer algo con esos archivos, por lo que recopilarlos en una Lista no tiene sentido).


Evito las bibliotecas IO de Java en la mayoría de mis aplicaciones no triviales, prefiriendo Commons VFS en su lugar. Creo que una llamada a este método con los parámetros adecuados logrará su objetivo, pero le concedo un largo camino por recorrer para la funcionalidad.

Específicamente, este código hará lo que quieras:

FileObject[] files = fileObject.findFiles(new FileSelector() { public boolean includeFile(FileSelectInfo fileInfo) { return fileInfo.getFile().getType() == FileType.FOLDER; } public boolean traverseDescendents(FileSelectInfo fileInfo) { return true; } });

donde fileObject es una instancia de FileObject.


Si observa el código fuente y lee entre líneas en el JavaDoc, verá que, desafortunadamente, esta API no está diseñada para hacer lo que quiere. Devolverá una lista de archivos (no una lista de archivos y directorios ) que coincidan con los argumentos proporcionados. En el código fuente, mire el método innerListFiles ; verá que los directorios se buscan y no se agregan a la lista de resultados.

No tengo conocimiento de ninguna API pública que haga lo que usted quiere. Esperemos que alguien más sepa de uno. La mayoría probablemente será un DFS, no un BFS, que puede o no ser importante para sus propósitos. (Hasta ahora, todo el código Java que he visto que hizo un recorrido de árbol de directorios lo hizo a través de una búsqueda en profundidad. Lo que no significa que los BFS no estén disponibles, por supuesto).

Si realmente desea una lista de todo en un directorio determinado, es muy fácil rodar la suya propia. Pero entiendo tu deseo de no reinventar la rueda.

Nota: es posible que Apache Commons Finder admita lo que necesita, pero esta biblioteca se encuentra en The Commons Sandbox, lo que significa que es más experimental en esta etapa. Puede o no estar completo y puede o no mantenerse. También puede ser pesado para lo que buscas.


Una solución Commons VFS más fácil y completa:

FileSystemManager fsManager = VFS.getManager(); FileObject fileObject = fsManager.resolveFile( "yourFileNameHere" ); FileObject[] files = fileObject.findFiles( new FileTypeSelector( FileType.FOLDER ) )


Una vieja respuesta pero esto funciona para mí:

FileUtils.listFilesAndDirs(new File(dir), TrueFileFilter.INSTANCE, DirectoryFileFilter.DIRECTORY);

muestra ambos:

Yo suelo:

FileUtils.listFilesAndDirs(new File(dir), new NotFileFilter(TrueFileFilter.INSTANCE), DirectoryFileFilter.DIRECTORY)

Solo muestra directorios y no archivos ...