2017-05-16 1 views
0

DescriptionÉvitez Java 8 Files.walk (..) La cause de l'arrêt de (java.nio.file.AccessDeniedException)

J'utilise Java Files.walk(..) compter .mp3 fichiers contenus dans un dossier et tous les dossiers à l'intérieur il . En d'autres termes, je visite tous les niveaux de l'arborescence de fichiers.

Lorsque je reçois java.nio.file.AccessDeniedException le Stream se ferme, je ne veux pas ce comportement. J'en ai besoin pour ignorer ou imprimer l'exception et continuer à compter les fichiers. Voici le code que j'utilise :):

  /** 
      * Count files in a directory (including files in all sub 
      * directories) 
      * 
      * @param directory 
      *  the directory to start in 
      * @return the total number of files 
      */ 
      public int countFiles(File dir) { 
       if (dir.exists()) 
        try (Stream<Path> paths = Files.walk(Paths.get(dir.getPath()), FileVisitOption.FOLLOW_LINKS)) { 
         return (int) paths.filter(path -> { 

          // i am using something different here but i changed 
          // it just for the purpose of StackOverFlow question         
          return path.toString().contains(".mp3"); 

         }).count(); 
        } catch (IOException ex) { 
         //Main.logger.log(Level.WARNING, "", ex); 
         ex.printStackTrace(); 
        } 

       return 0; 
      } 

StackTrace of error:

java.io.UncheckedIOException: java.nio.file.AccessDeniedException: C:\$Recycle.B 
in\S-1-5-18 
    at java.nio.file.FileTreeIterator.fetchNextIfNeeded(FileTreeIterator.java:88) 
    at java.nio.file.FileTreeIterator.hasNext(FileTreeIterator.java:104) 
    at java.util.Iterator.forEachRemaining(Iterator.java:115) 
    at java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.jav 
a:1801) 
    at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481) 
    at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471) 
    at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708) 
    at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) 
    at java.util.stream.LongPipeline.reduce(LongPipeline.java:438) 
    at java.util.stream.LongPipeline.sum(LongPipeline.java:396) 
    at java.util.stream.ReferencePipeline.count(ReferencePipeline.java:526) 
    at smartcontroller.SmartController$InputService$1.countFiles(SmartController.ja 
va:2092) 
... 

Similar question , though not the same i need a Stream to be returned .

Working around access denied in a FileWalking Tree in Java7.


+0

utiliser la version non-essayer avec-ressources dans le double lien vers vous –

+0

@JarrodRoberson je dois obtenir un 'Stream', donc je peux utiliser des méthodes Java8. Pouvez-vous poster une réponse à ce sujet :)? – GOXR3PLUS

+0

Votre code ne compile pas, à l'intérieur du bloc try il y a du code désordonné (un return et un count() qui ne font référence à rien). S'il vous plaît poster quelque chose de correct pour nous laisser vous aider correctement :) – Prim

Répondre

1

Réponse

est ici une solution temporaire, qui peut être amélioré pour utiliser Java 8 Streams et lambdas.

int[] count = {0}; 
try { 
    Files.walkFileTree(Paths.get(dir.getPath()), new HashSet<FileVisitOption>(Arrays.asList(FileVisitOption.FOLLOW_LINKS)), 
      Integer.MAX_VALUE, new SimpleFileVisitor<Path>() { 
       @Override 
       public FileVisitResult visitFile(Path file , BasicFileAttributes attrs) throws IOException { 
        System.out.printf("Visiting file %s\n", file); 
        ++count[0]; 

        return FileVisitResult.CONTINUE; 
       } 

       @Override 
       public FileVisitResult visitFileFailed(Path file , IOException e) throws IOException { 
        System.err.printf("Visiting failed for %s\n", file); 

        return FileVisitResult.SKIP_SUBTREE; 
       } 

       @Override 
       public FileVisitResult preVisitDirectory(Path dir , BasicFileAttributes attrs) throws IOException { 
        System.out.printf("About to visit directory %s\n", dir); 
        return FileVisitResult.CONTINUE; 
       } 
      }); 
} catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
}