2012-02-05 12 views
15

he estado tratando de utilizar la nueva característica englobamiento en JDK7, a partir de the documentation and examples¿Cómo utilizo directorio globbing en JDK7

puedo conseguir pegotes como "glob:*.dat" para trabajar con el ejemplo

Files.walkFileTree(startingDir, finder); 

pero no he podido obtener la sintaxis "**" funcionando. Me gustaría poder crear algo como:

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

y agradeceré un ejemplo simple. Estoy usando Windows 7.

ACTUALIZACIÓN: @Oleg y @JBNizet dejan en claro que la sintaxis "/" es independiente del sistema operativo. Tenga en cuenta que la Javadocs sugieren que la sintaxis OS dependiente también es posible

sigue habiendo problemas (requerido?): Haber @Nizet y editado de la siguiente manera:

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

y esto da salida como:

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 

pero no hay evidencia de igualar

+0

'/' funcionará bien en cualquier sistema Windows si esa es su preocupación –

+0

@Oleg gracias. Así que tengo algo de lógica equivocada o supongo que los métodos tienen una funcionalidad diferente. Por lo tanto, File.separator está mal? [Creo que la documentación oficial es bastante incompleta] –

+0

¿Has probado "glob: **/*. Cml"? –

Respuesta

12

Aquí está un ejemplo de trabajo que muestra todos los archivos zip en cualquier directorio descendiente ectory de 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; 
     } 
    }); 
} 

Como se puede ver, utilizando barras inclinadas funciona en Windows.

+1

Gracias. ¿Verificará las rutas de archivos relativas? –

+0

lo han aceptado ya que es la única respuesta y ha solucionado el problema del separador de archivos. Pero no puedo hacer que funcione en mi entorno. La sintaxis globbing parece bastante poco documentada y no hay ejemplos claros. Oh, bueno, probablemente funcione mañana ... –

+1

Si desea eliminar el uso específico de la unidad después de 'glob: */**/*. Zip' –

5

que necesita para empezar su pegote con **

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

De lo contrario, llamando

matcher.matches(file) 

intentos para que coincida con la ruta completa al archivo con una expresión regular que comienza con la ruta relativa (/ foo /), en lugar de con la ruta absoluta (d:/petermr-workspace /.../ foo).

Anteponiendo ** al globo solo le dice que ignore el comienzo de la ruta absoluta.

Cuestiones relacionadas