2012-02-05 29 views
15

Tôi đã cố gắng để sử dụng tính năng globbing mới trong JDK7, bắt đầu từ the documentation and examplesLàm thế nào để sử dụng thư mục globbing trong JDK7

tôi có thể nhận được những đống như "glob:*.dat" để làm việc với các ví dụ

Files.walkFileTree(startingDir, finder); 

nhưng tôi không thể nhận cú pháp "**". Tôi muốn có thể tạo một cái gì đó như:

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

và sẽ biết ơn ví dụ đơn giản. Tôi đang sử dụng Windows 7.

CẬP NHẬT: @Oleg và @JBNizet làm rõ rằng cú pháp "/" là không phụ thuộc vào hệ điều hành. Lưu ý rằng Javadocs gợi ý rằng cú pháp OS phụ thuộc cũng có thể

VẪN VẤN ĐỀ (theo yêu cầu?): đã lấy @Nizet và chỉnh sửa như sau:

@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; 
     } 
    }); 
} 

và điều này mang lại cho sản lượng như:

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 

nhưng không có bằng chứng về sự phù hợp với

+0

'/' sẽ hoạt động tốt trên bất kỳ hệ thống Windows nào nếu đó là mối quan tâm của bạn –

+0

@Xin cảm ơn. Vì vậy, tôi đã có một số logic sai hoặc giả định các phương pháp có chức năng khác nhau. File.separator do đó sai? [Tôi tìm thấy tài liệu chính thức khá sơ sài] –

+0

bạn đã thử "glob: **/*. Cml" chưa? –

Trả lời

12

Dưới đây là một ví dụ làm việc đó sẽ hiển thị tất cả các file zip trong bất kỳ dir hậu duệ ectory của d:/:

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; 
     } 
    }); 
} 

Như bạn thấy, sử dụng dấu gạch chéo tiến hoạt động trên Windows.

+1

Cảm ơn. Nó sẽ kiểm tra đường dẫn tập tin tương đối? –

+0

đã chấp nhận điều này vì đó là câu trả lời duy nhất và nó giải quyết được vấn đề của bộ phân tách tệp. Nhưng tôi không thể làm cho nó hoạt động trên môi trường của tôi. Cú pháp globbing có vẻ khá nhẹ và không có ví dụ rõ ràng. Oh well, có thể sẽ làm việc vào ngày mai ... –

+1

Nếu bạn thậm chí muốn loại bỏ việc sử dụng ổ đĩa cụ thể sau 'glob: */**/*. Zip' –

5

Bạn cần bắt đầu glob của bạn với **

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

Nếu không, gọi

matcher.matches(file) 

cố gắng để phù hợp với đường dẫn đầy đủ đến tập tin chống lại một biểu thức chính quy mà bắt đầu với đường dẫn tương đối (/ foo /), thay vì với đường dẫn tuyệt đối (d:/petermr-workspace /.../ foo).

Chuẩn bị ** đến glob chỉ cho phép bỏ qua phần đầu của đường dẫn tuyệt đối.