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).

1voto

Anatolii Shuba Punkte 1712

Nur Java-Streams verwenden

Path testPath = Paths.get("C:\");

Stream<Path> stream =
                Files.find(testPath, 1,
                        (path, basicFileAttributes) -> {
                            File file = path.toFile();
                            return file.getName().endsWith(".java");
                        });

// Print all files found
stream.forEach(System.out::println);

0voto

Elijah Punkte 12990

Warum nicht so etwas wie:

File myRelativeDir = new File("../../foo");
String fullPath = myRelativeDir.getCanonicalPath();
Sting wildCard = fullPath + File.separator + "*.txt";

// now you have a fully qualified path

Dann müssen Sie sich keine Gedanken über relative Pfade machen und können nach Bedarf Platzhalter verwenden.

0voto

Drona Punkte 6442

Implementiert die JDK FileVisitor Schnittstelle. Hier ist ein Beispiel http://wilddiary.com/list-files-matching-a-naming-pattern-java/

0voto

Tony Punkte 1338

Util-Methode:

public static boolean isFileMatchTargetFilePattern(final File f, final String targetPattern) {
        String regex = targetPattern.replace(".", "\\.");  //escape the dot first
        regex = regex.replace("?", ".?").replace("*", ".*");
        return f.getName().matches(regex);

    }

jUnit-Test:

@Test
public void testIsFileMatchTargetFilePattern()  {
    String dir = "D:\\repository\\org\my\\modules\\mobile\\mobile-web\\b1605.0.1";
    String[] regexPatterns = new String[] {"_*.repositories", "*.pom", "*-b1605.0.1*","*-b1605.0.1", "mobile*"};
    File fDir = new File(dir);
    File[] files = fDir.listFiles();

    for (String regexPattern : regexPatterns) {
        System.out.println("match pattern [" + regexPattern + "]:");
        for (File file : files) {
            System.out.println("\t" + file.getName() + " matches:" + FileUtils.isFileMatchTargetFilePattern(file, regexPattern));
        }
    }
}

Ausgabe:

match pattern [_*.repositories]:
    mobile-web-b1605.0.1.pom matches:false
    mobile-web-b1605.0.1.war matches:false
    _remote.repositories matches:true
match pattern [*.pom]:
    mobile-web-b1605.0.1.pom matches:true
    mobile-web-b1605.0.1.war matches:false
    _remote.repositories matches:false
match pattern [*-b1605.0.1*]:
    mobile-web-b1605.0.1.pom matches:true
    mobile-web-b1605.0.1.war matches:true
    _remote.repositories matches:false
match pattern [*-b1605.0.1]:
    mobile-web-b1605.0.1.pom matches:false
    mobile-web-b1605.0.1.war matches:false
    _remote.repositories matches:false
match pattern [mobile*]:
    mobile-web-b1605.0.1.pom matches:true
    mobile-web-b1605.0.1.war matches:true
    _remote.repositories matches:false

-1voto

Kushal Baidya Punkte 1

Der einfachste und leichteste Weg unter Verwendung der Dateiklasse der io-Bibliothek wäre :

    String startingdir="The directory name";
    String filenameprefix="The file pattern"
    File startingDirFile=new File(startingdir); 
    final File[] listFiles=startingDirFile.listFiles(new FilenameFilter() {
        public boolean accept(File arg0,String arg1)
        {System.out.println(arg0+arg1);
            return arg1.matches(filenameprefix);}
        });
    System.out.println(Arrays.toString(listFiles));

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