2012-02-05 12 views
15

Ho cercato di utilizzare la nuova funzionalità globbing in JDK7, a partire dal the documentation and examplesCome faccio a utilizzare directory globbing in JDK7

posso ottenere gocce come "glob:*.dat" a lavorare con l'esempio

Files.walkFileTree(startingDir, finder); 

ma non sono riuscito a ottenere il funzionamento della sintassi "**". Vorrei essere in grado di creare qualcosa di simile:

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

e sarei grato per un semplice esempio. Sto usando Windows 7.

AGGIORNAMENTO: @Oleg e @JBNizet chiariscono che la sintassi "/" è indipendente dal sistema operativo. Si noti che il Javadocs suggeriscono che la sintassi dipende dal sistema operativo è anche possibile

ancora problemi (richiesto?): Avete preso @Nizet e modificata come segue:

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

e questo dà in uscita come ad esempio:

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 

ma nessuna prova di corrispondenza

+0

'/' funzionerà correttamente su qualsiasi sistema Windows se questo è il tuo problema –

+0

@ Oleg, grazie. Quindi ho sbagliato la logica o ho assunto che i metodi abbiano funzionalità diverse. File.separator è quindi sbagliato? [Trovo la documentazione ufficiale piuttosto abbozzata] –

+0

hai provato "glob: **/*. Cml"? –

risposta

12

Ecco un esempio di lavoro che visualizza tutti i file zip in qualsiasi dir discendente ectory di 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; 
     } 
    }); 
} 

Come si vede, utilizzando le barre funziona su Windows.

+1

Grazie. Controllerà i percorsi dei file relativi? –

+0

hanno accettato questo perché è l'unica risposta e ha affrontato il problema del separatore di file. Ma non riesco a farlo funzionare sul mio ambiente. La sintassi globbing sembra piuttosto leggermente documentata e non ci sono esempi chiari. Oh beh, probabilmente funzionerà domani ... –

+1

Se vuoi anche rimuovere l'uso specifico dell'unità seguendo 'glob: */**/*. Zip' –

5

avete bisogno per iniziare la vostra glob con **

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

In caso contrario, chiamando

matcher.matches(file) 

tentativi per abbinare il percorso completo del file contro un'espressione regolare che inizia con il percorso relativo (/ foo /), piuttosto che con il percorso assoluto (d:/petermr-workspace /.../ foo).

La preformazione del ** al glob indica semplicemente di ignorare l'inizio del percorso assoluto.

Problemi correlati