Как использовать глобализацию каталогов в JDK7 - PullRequest
18 голосов
/ 05 февраля 2012

Я пытался использовать новую функцию globbing в JDK7, начиная с документации и примеров

Я могу заставить глобусы типа "glob:*.dat" работать с

Files.walkFileTree(startingDir, finder);

пример, но мне не удалось заставить работать синтаксис "**". Я хотел бы иметь возможность создать что-то вроде:

matcher = FileSystems.getDefault().getPathMatcher("glob:" + "foo/**/bar/*.dat");

и был бы признателен за простой пример. Я использую Windows 7.

UPDATE: @Oleg и @JBNizet дают понять, что синтаксис "/" не зависит от ОС. Обратите внимание, что Javadocs предполагает, что OS-зависимый синтаксис также возможен (? Обязательно)

ВСЕ ЕЩЕ ПРОБЛЕМЫ: Взяли @Nizet и отредактировали следующим образом:

@Test
public void testStackoverflowGlobber() throws IOException {
    final PathMatcher matcher =
 FileSystems.getDefault().getPathMatcher("glob:*.cml");
        Files.walkFileTree(Paths.get("d:/petermr-workspace/jumbo-converters/jumbo-converters-cli/src/test/resources"), new SimpleFileVisitor<Path>() {
            @Override
            public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
                System.out.println("try>> "+file);
                if (matcher.matches(file)) {
                    System.out.println("MATCHES>>"+file);
                }
                return FileVisitResult.CONTINUE;
            }
        @Override
        public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
            return FileVisitResult.CONTINUE;
        }
    });
}

и это дает вывод, такой как:

try>> d:\petermr-workspace\jumbo-converters\jumbo-converters-cli\src\test\resources\examples\cdx\r19.cdx
try>> d:\petermr-workspace\jumbo-converters\jumbo-converters-cli\src\test\resources\examples\cdx\r19.cdxml
try>> d:\petermr-workspace\jumbo-converters\jumbo-converters-cli\src\test\resources\examples\cdx\r19.cml
try>> d:\petermr-workspace\jumbo-converters\jumbo-converters-cli\src\test\resources\examples\cdx\r19.ref.cdxml
try>> d:\petermr-workspace\jumbo-converters\jumbo-converters-cli\src\test\resources\examples\cdx\r19.ref.cml
try>> d:\petermr-workspace\jumbo-converters\jumbo-converters-cli\src\test\resources\examples\cif\aa2004.cml

но нет доказательств соответствия

Ответы [ 2 ]

14 голосов
/ 05 февраля 2012

Вот рабочий пример, который отображает все zip-файлы в любом каталоге-потомке d:/:

public static void main(String[] args) throws IOException {
    final PathMatcher matcher = FileSystems.getDefault().getPathMatcher("glob:d:/**/*.zip");
    Files.walkFileTree(Paths.get("d:/"), new SimpleFileVisitor<Path>() {
        @Override
        public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
            if (matcher.matches(file)) {
                System.out.println(file);
            }
            return FileVisitResult.CONTINUE;
        }

        @Override
        public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
            return FileVisitResult.CONTINUE;
        }
    });
}

Как видите, использование прямой косой черты работает в Windows.

7 голосов
/ 05 января 2013

Вы должны начать свой шар с **

matcher = FileSystems.getDefault().getPathMatcher("glob:**/foo/**/bar/*.dat");

В противном случае звоните

matcher.matches(file)

пытается сопоставить полный путь к файлу с регулярным выражением, которое начинается с относительного пути (/ foo /), а не с абсолютного пути (d: / petermr-workspace /.../ foo).

Добавление ** к глобусу просто говорит ему игнорировать начало абсолютного пути.

...