2016-10-28 64 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

相關問題