2012-02-05 3 views
15

내가 the documentation and examples어떻게 JDK7

에서 나는

Files.walkFileTree(startingDir, finder); 

예와 함께 작동하도록 같은 "glob:*.dat"으로 globs의를 얻을 수 있습니다 시작 JDK7의 새로운 대체 (globbing) 기능을 사용하기 위해 노력 해왔다에 글 로빙 디렉토리를 사용합니까 그러나 나는 "**" 구문을 작동시키지 못했습니다. 나는 다음과 같은 것을 만들 수 있기를 바란다 :

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

그리고 간단한 예제에 감사 할 것이다. Windows 7을 사용하고 있습니다.

업데이트 : @Oleg 및 @JBNizet은 "/"구문이 OS 독립적이라는 것을 분명히합니다. Javadocs는 OS 의존 문법도 가능하다는 것을 시사 유의

STILL

과제를 (필요한?) 는 @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 

하지만 여기

+0

'/'그것이 문제라면 모든 Windows 시스템에서 정상적으로 작동합니다. –

+0

@Oleg thanks. 그래서 일부 논리가 잘못되었거나 메소드가 다른 기능을 가지고 있다고 가정합니다. File.separator 따라서 잘못 되었습니까? [나는 공식 문서가 다소 추상적 임] –

+0

"glob : **/*. cml"을 시도 했습니까? –

답변

12

일치의 증거는 후손의 디렉토리에있는 모든 압축 파일을 표시하는 작업 예를 없다 d:/의 ectory :

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에서 작품을 슬래시.

+1

감사합니다. 상대 파일 경로를 확인합니까? –

+0

이 유일한 대답이므로 파일 구분 기호 문제를 해결했습니다. 하지만 내 환경에서 작동하도록 할 수는 없습니다. globbing 문법은 다소 가볍게 문서화 된 것처럼 보입니다. 명확한 예제가 없습니다. 오 잘, 아마 내일 일할 것입니다 ... –

+1

'glob : */**/*. zip' –

5

당신은 (**와 글로브를 시작하는 상대 경로로 시작하는 정규 표현식에 대해 파일의 전체 경로와 일치하는

matcher.matches(file) 

시도를 호출 그렇지 않으면

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

필요/foo /)가 아니라 절대 경로 (d :/petermr-workspace /.../ foo)를 사용하십시오.

glob에 **를 추가하면 절대 경로의 시작 부분을 무시합니다.