195 Stimmen

Wie kann man in Java Dateien finden, die einer Wildcard-Zeichenfolge entsprechen?

Das sollte wirklich einfach sein. Wenn ich einen String wie diesen habe:

../Test?/sample*.txt

was ist dann eine allgemein akzeptierte Methode, um eine Liste von Dateien zu erhalten, die diesem Muster entsprechen? (z.B. sollte es übereinstimmen mit ../Test1/sample22b.txt y ../Test4/sample-spiffy.txt aber nicht ../Test3/sample2.blah ou ../Test44/sample2.txt )

Ich habe mir Folgendes angeschaut org.apache.commons.io.filefilter.WildcardFileFilter und es scheint das richtige Biest zu sein, aber ich bin mir nicht sicher, wie ich es für die Suche nach Dateien in einem relativen Verzeichnispfad verwenden soll.

Ich nehme an, ich kann die Quelle für ant suchen, da es Wildcard-Syntax verwendet, aber ich muss etwas ziemlich offensichtlich hier übersehen.

( bearbeiten : Das obige Beispiel war nur ein Beispielfall. Ich bin auf der Suche nach einer Möglichkeit, allgemeine Pfade mit Platzhaltern zur Laufzeit zu analysieren. Ich habe herausgefunden, wie man es auf der Grundlage von mmyers' Vorschlag zu tun, aber es ist irgendwie ärgerlich. Ganz zu schweigen davon, dass die Java JRE einfache Wildcards in der main(String[] Argumente) aus einem einzigen Argument automatisch zu parsen scheint, um mir Zeit und Ärger zu "sparen"... Ich bin nur froh, dass ich keine Nicht-Dateiargumente in der Mischung hatte).

13voto

NateS Punkte 5533

Die Wildcard-Bibliothek kann sowohl Glob- als auch Regex-Dateinamen effizient abgleichen:

http://code.google.com/p/wildcard/

Die Implementierung ist kurz und bündig - JAR ist nur 12,9 Kilobyte groß.

12voto

Umair Aziz Punkte 1518

Ein einfacher Weg ohne externe Importe ist die Verwendung dieser Methode

Ich habe csv-Dateien mit den Namen billing_201208.csv, billing_201209.csv und billing_201210.csv erstellt und es sieht so aus, als würde es gut funktionieren.

Die Ausgabe sieht folgendermaßen aus, wenn die oben aufgeführten Dateien vorhanden sind

found billing_201208.csv
found billing_201209.csv
found billing_201210.csv

    //Use Import ->import java.io.File
        public static void main(String\[\] args) {
        String pathToScan = ".";
        String target\_file ;  // fileThatYouWantToFilter
        File folderToScan = new File(pathToScan); 

        File[] listOfFiles = folderToScan.listFiles();

         for (int i = 0; i < listOfFiles.length; i++) {
                if (listOfFiles[i].isFile()) {
                    target_file = listOfFiles[i].getName();
                    if (target_file.startsWith("billing")
                         && target_file.endsWith(".csv")) {
                    //You can add these files to fileList by using "list.add" here
                         System.out.println("found" + " " + target_file); 
                    }
               }
         }    
    }

6voto

Oliver Coleman Punkte 674

Wie bereits in einer anderen Antwort erwähnt, funktioniert die Wildcard-Bibliothek sowohl für Glob- als auch für Regex-Abgleiche von Dateinamen: http://code.google.com/p/wildcard/

Ich habe den folgenden Code verwendet, um globale Muster einschließlich absoluter und relativer Muster auf *nix-Dateisystemen abzugleichen:

String filePattern = String baseDir = "./";
// If absolute path. TODO handle windows absolute path?
if (filePattern.charAt(0) == File.separatorChar) {
    baseDir = File.separator;
    filePattern = filePattern.substring(1);
}
Paths paths = new Paths(baseDir, filePattern);
List files = paths.getFiles();

Ich habe einige Zeit damit verbracht, die FileUtils.listFiles-Methoden in der Apache Commons io-Bibliothek (siehe Vladimirs Antwort) dazu zu bringen, dies zu tun, hatte aber keinen Erfolg (ich erkenne jetzt/denke, dass es nur den Musterabgleich eines Verzeichnisses oder einer Datei auf einmal verarbeiten kann).

Außerdem würde die Verwendung von Regex-Filtern (siehe Fabians Antwort) zur Verarbeitung beliebiger benutzerdefinierter glob-Muster vom absoluten Typ, ohne das gesamte Dateisystem zu durchsuchen, eine gewisse Vorverarbeitung des übergebenen glob erfordern, um das größte Nicht-Regex/Glob-Präfix zu ermitteln.

Natürlich kann Java 7 die gewünschte Funktionalität gut handhaben, aber leider bin ich im Moment noch auf Java 6 angewiesen. Die Bibliothek ist mit 13,5kb relativ klein.

Hinweis an die Rezensenten: Ich habe versucht, die obige Antwort, in der diese Bibliothek erwähnt wird, zu ergänzen, aber die Bearbeitung wurde abgelehnt. Ich habe auch nicht genug Vertreter, um dies als Kommentar hinzuzufügen. Gibt es nicht einen besseren Weg...

6voto

Globus von Java7: Dateien finden . ( Muster )

3voto

Michael Myers Punkte 183216

Der Apache-Filter ist für die Iteration von Dateien in einem bekannten Verzeichnis konzipiert. Um auch Wildcards im Verzeichnis zuzulassen, müssten Sie den Pfad auf ' \ ' oder ' / ' und filtern Sie jeden Teil einzeln.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X