【问题标题】:Glob Syntax not working for Windows PathMatcherGlob 语法不适用于 Windows PathMatcher
【发布时间】:2016-10-28 21:30:24
【问题描述】:

无论出于何种原因,我似乎无法获得一个 glob 语法路径匹配器来匹配任何文件。

我已将代码简化为以下方法:

public static void match() throws IOException {

        String startingLocation = "C:\\";

        PathMatcher pathMatcher = FileSystems.getDefault().getPathMatcher("glob:*");

        Files.walkFileTree(Paths.get(startingLocation), new SimpleFileVisitor<Path>() {

            @Override
            public FileVisitResult visitFile(Path path,
                    BasicFileAttributes attrs) throws IOException {
                if (pathMatcher.matches(path)) {
                    System.out.println(path);
                }
                return FileVisitResult.CONTINUE;
            }

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

我的理解是该方法应该列出我 C 盘上的所有文件。但是,它不会打印出单个文件。

有趣的是,如果我使用“regex:.”而不是“glob:”运行相同的东西,它似乎确实列出了我 C 驱动器上的所有文件。

我可以努力将我的 glob 表达式转换为正则表达式,但我真的不想这样做。

有人知道可能出了什么问题吗?

请注意,我在装有 Java 8 的 Windows 7 机器上运行

【问题讨论】:

  • the documentation 看来,您的 glob 表达式应该类似于 "glob:C:\\**"
  • 它也不适用于“glob:C:\\**”。
  • 你试过"glob:C:\\\\**"吗? javadoc 声明:“注意反斜杠被转义;作为 Java 语言中的字符串文字,模式将是 "C:\\\\*"
  • ^ 关于那条评论,你可以参考stackoverflow.com/a/25260067/1743880吗?

标签: java glob


【解决方案1】:

请务必仔细阅读javadoc

如果你想打印出C:驱动器的所有文件, 将模式更改为 glob:**glob:C:\\\\**(如 javadoc 中所写)。

还要注意Files.walkFileTree 只匹配文件。

【讨论】:

  • 我觉得应该是glob:C:\\\\**
  • 是的,我也是。(并且刚刚测试过)。 glob:** 确实有效,并打印了 C 盘下的文件。
  • 谢谢@JonnyHenly,你是对的(也写在javadoc中)
  • 只是为了让它更清楚一点(我一开始不明白):作为路径分隔符的反斜杠总是需要转义。如果从字符串文字构造 glob,这将导致 4 个斜线用于一个路径分隔符。
猜你喜欢
  • 2016-05-19
  • 1970-01-01
  • 1970-01-01
  • 2016-04-25
  • 2020-04-23
  • 2017-09-10
  • 2011-06-15
  • 1970-01-01
  • 2021-01-14
相关资源
最近更新 更多