2016-10-28 32 views
0

无论出于何种原因,我似乎无法获得全局语法路径匹配器来匹配任何文件。全局语法不适用于Windows PathMatcher

我已经简化我的代码到下面的方法:

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盘上。但是,它不打印出单个文件。有趣的是,如果我用“正则表达式:。”而不是“glob:”运行同样的东西,它似乎列出了我C驱动器上的所有文件。

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

有没有人有任何想法可能会出错?

请注意,我在Windows 7机器上使用Java 8

+0

从[文档](https://docs.oracle.com/javase/7/docs/api/java/nio/file/FileSystem.html#getPathMatcher%28java.lang.String%29)它似乎就好像你的glob表达式应该类似于'“glob:C:\\ **”'。 –

+0

它也不适用于“glob:C:\\\ **”。 – NateW

+0

你试过'“glob:C:\\\\ **”'? javadoc声明:*“请注意反斜杠被转义;作为Java语言中的字符串字面值,该模式将与该注释相关”C:\\\\\ *“'”* –

回答

2

运行,请务必仔细阅读javadoc

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

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

+1

我认为它需要是'glob:C:\\\\ **'。 –

+1

是的,我也是。(只是测试)。 'glob:**'确实可以工作,并将文件打印在C盘下。 – Tunaki

+1

感谢@JonnyHenly,你是对的(也写在javadoc中) – janos

相关问题