De manière récursive trouver uniquement les répertoires avec FileUtils.listFiles
Je veux rassembler une liste de tous fichiers dans un répertoire, en particulier, y compris les sous-répertoires. Je n'aime pas faire les choses moi-même, donc je suis en utilisant FileUtils.listFiles
de Apache Commons IO. J'ai donc quelque chose comme:
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);
}
}
}
Problème est que cela ne semble trouver normal les fichiers, pas les répertoires:
$ mkdir -p foo/bar/baz; touch foo/one_file
$ java -classpath commons-io-1.4.jar:. TestListFiles
Found file: foo/one_file
Je suis déjà passer TrueFileFilter
pour les deux filtres, donc je ne peux pas penser à quelque chose de plus inclusive. Je veux la liste: "foo", "foo/one_file", "foo/bar", "foo/bar/baz"
(dans n'importe quel ordre).
Je accepter non-FileUtils
des solutions, mais il semble ridicule d'avoir à écrire mon propre BFS, ou même de recueillir l'ensemble des répertoires parents à partir de la liste je ne l'obtenir. (Ce serait manquer sous-répertoires vides de toute façon.) C'est sur Linux, FWIW.
Vous devez vous connecter pour publier un commentaire.
Une vieille réponse, mais cela fonctionne pour moi:
montre à la fois:
J'utilise:
Affiche uniquement les répertoires et les fichiers...
Si vous regardez la le code source et lire entre les lignes dans la JavaDoc, vous verrez que, malheureusement -- cette API n'est pas conçu pour faire ce que vous voulez. Il sera de retour une liste de fichiers (et non une liste de des fichiers et des répertoires) qui correspondent aux arguments fournis. Dans le code source -- regardez la méthode
innerListFiles
-- vous verrez que les répertoires sont recherchées et pas ajouté à la liste des résultats.Je ne suis pas au courant d'une API publique qui permettra de faire ce que vous voulez. J'espère que quelqu'un d'autre le fera savoir de l'un. La plupart seront probablement un DFS, pas un BFS, ce qui peut ou ne peut pas d'importance à vos fins. (Jusqu'à présent, tous code Java que j'ai jamais regardé ça fait un répertoire de l'arbre transversal fait par l'intermédiaire d'une profondeur d'abord de recherche. Ce qui ne veut pas dire que BFS ne sont pas là, bien sûr.)
Si vous voulez vraiment une liste de tout en vertu d'un répertoire donné, il est assez facile de rouler votre propre. Mais je comprends votre souhait de ne pas réinventer la roue.
Remarque: Il est possible que Apache Commons Finder soutiennent ce que vous avez besoin, mais cette bibliothèque est à La chambre des Communes le bac à sable, ce qui signifie qu'il est plus expérimental à ce stade. Il peut ou peut ne pas être complète et il peut ou ne peut pas être maintenu. Il peut également être lourd pour ce que vous êtes recherche pour.
Avez-vous essayé simplement:
Il semble fonctionner pour moi.
Vous aurez besoin de la récursivité, bien sûr.
Espère que cela aide.
- Je éviter la Java IO bibliothèques dans la plupart de mes non-trivial applications, préférant Communes VFS à la place. Je crois qu'un appel à cette méthode avec les params permettra d'atteindre votre objectif, mais je vous l'accorde c'est un long chemin à parcourir pour que la fonctionnalité.
Plus précisément, ce code va faire ce que vous voulez:
où fileObject est une instance de FileObject.
Plus facile+complet Communes VFS solution:
Il doit travailler, basée sur leur API.
Voici ma propre version de FileUtils, pas aussi complet que Commons IO, il contient uniquement ce dont j'ai besoin. Recherche pour findFiles ou vous pouvez utiliser itérer pour éviter de créer des listes énormes(parfois/la plupart du temps vous voulez juste faire quelque chose avec ces fichiers afin de les recueillir dans une Liste, il n'a pas de sens).