Как найти файлы, которые соответствуют подстановочной строке в Java? - PullRequest
133 голосов
/ 27 апреля 2009

Это должно быть действительно просто. Если у меня есть такая строка:

../Test?/sample*.txt

тогда каков общепринятый способ получения списка файлов, соответствующих этому шаблону? (например, оно должно соответствовать ../Test1/sample22b.txt и ../Test4/sample-spiffy.txt, но не ../Test3/sample2.blah или ../Test44/sample2.txt)

Я посмотрел на org.apache.commons.io.filefilter.WildcardFileFilter, и это похоже на правильного зверя, но я не уверен, как использовать его для поиска файлов по относительному пути к каталогу.

Полагаю, я могу найти источник для ant, поскольку он использует подстановочный синтаксис, но я, должно быть, здесь упускаю что-то довольно очевидное.

( edit : приведенный выше пример был просто примером. Я ищу способ разбора общих путей, содержащих подстановочные знаки во время выполнения. Я выяснил, как это сделать, основываясь на предложении mmyers, но Это немного раздражает. Не говоря уже о том, что JRE Java, кажется, автоматически анализирует простые подстановочные знаки в основном (аргументы String []) из одного аргумента, чтобы «сэкономить» мое время и хлопоты ... не содержит файловых аргументов в смеси.)

Ответы [ 16 ]

4 голосов
/ 03 июня 2013
3 голосов
/ 27 апреля 2009

Фильтр Apache создан для итерации файлов в известном каталоге. Чтобы разрешить использование подстановочных знаков в каталоге, необходимо разделить путь на '\' или '/' и выполнить фильтр для каждой части отдельно.

0 голосов
/ 06 апреля 2019
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);
0 голосов
/ 23 января 2016

Используемый метод:

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));
        }
    }
}

Выход:

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
0 голосов
/ 16 декабря 2014

Реализация интерфейса JDK FileVisitor. Вот пример http://wilddiary.com/list-files-matching-a-naming-pattern-java/

0 голосов
/ 27 апреля 2009

Почему бы не использовать что-то вроде:

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

// now you have a fully qualified path

Тогда вам не нужно будет беспокоиться об относительных путях, и вы сможете выполнять подстановочные знаки по мере необходимости.

...