繁体   English   中英

如何在JDK7中使用目录通配符

[英]How do I use directory globbing in JDK7

我一直在尝试使用JDK7中的新globbing功能,从文档和示例开始

我可以使用诸如"glob:*.dat"这样的"glob:*.dat"来处理

Files.walkFileTree(startingDir, finder);

例子,但我一直无法使"**"语法工作。 我希望能够创建类似的东西:

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

并希望得到一个简单的例子。 我使用的是Windows 7。

更新:@Oleg和@JBNizet清楚地表明“/”语法与操作系统无关。 请注意, Javadocs建议也可以使用依赖于操作系统的语法(需要)

仍有问题:已采取@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

但没有匹配的证据

这是一个工作示例,它显示d:/任何后代目录中的所有zip文件:

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。

你需要用**开始你的全局

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

否则,打电话

matcher.matches(file)

尝试将文件的完整路径与以相对路径(/ foo /)开头的正则表达式匹配,而不是与绝对路径(d:/ petermr-workspace /.../ foo)匹配。

将**添加到glob只是告诉它忽略绝对路径的开头。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM