2015-10-12 3 views
0

Я создал инструмент, который проверяет файлы pdf на наличие ошибок. Инструмент выбирает с файловым файлом каталог, проверяет, есть ли файлы PDF и сканирует их. Но я хочу, чтобы инструмент проверял рекурсивно каталог. Если бы я попробовать этот код:Список файлов pdf рекурсивно

public class RecursiveFileDisplay { 

    public static void main(String[] args) { 
     File currentDir = new File("C://Users//Tommy//Desktop"); // current directory 
     displayDirectoryContents(currentDir); 
    } 

    public static void displayDirectoryContents(File dir) { 
     try { 
      File[] files = dir.listFiles(); 
      for (File file : files) {       
       if (file.isDirectory()) { 
         displayDirectoryContents(file); 

       } else { 
        if (file.getName().endsWith((".pdf"))) { 
         System.out.println("  file:" + file.getCanonicalPath()); 
        } 
       } 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

инструмент покажет мне для каждого каталога на рабочем столе новый список и не суммировать все результаты в одном списке ...: 1st directorty on Desktopenter image description here

ответ

1

Если вы хотите, чтобы ваша программа, чтобы создать целый список всех обрабатываемых файлов, то вы должны изменить свой метод displayDirectoryContent следующим образом:

public static List<File> displayDirectoryContents(File dir) { 
    ArrayList<File> rtnFiles = new ArrayList<File>(); 

    try { 
      File[] files = dir.listFiles(); 

      for (File file : files) { 

        if (file.isDirectory()) { 
          rtnFiles.addAll(displayDirectoryContents(file)); 

        } else { 
         if (file.getName().endsWith((".pdf"))) { 
          System.out.println("  file:" + file.getCanonicalPath()); 
          rtnFiles.add(file); 
         } 
        } 
      } 
    } catch (IOException e) { 
      e.printStackTrace(); 
    } 

    return rtnFiles; 
} 

Таким образом, он вернет вас со всеми найденными файлами/обработаны. Если вы хотите, чтобы этот метод возвращал вам только файлы с отказами, вам нужно будет проверить не только файл .pdf, но он нормально/не удалось, а затем добавить в список.

Если вы хотите контролировать сумму, то вы можете создать Java-класс с двумя целыми числами для файлов, найденных в формате pdf, а для других файлов, найденных в pdf, не найдено. Рекурсивно вы можете включить его так же, как я создаю список.

Надеюсь, это поможет.

+0

Привет, спасибо за быструю помощь. Я изменил свой код, но проблема здесь снова: метод инструмента для перебора файлов PDF называется несколько раз; для каждого каталога на рабочем столе :( – okaisan1

+0

Ну, может быть, я не понимаю, но я верю этому, что он должен делать, не так ли? Я имею в виду, это рекурсивный (* вы просите *) метод , так что в первом вызове он будет называть себя по одному в подкаталоге и т. д. Извините, если я вас не понял. – malaguna

+0

nono вы все в порядке, и ваш метод идеален! Но, может быть, он просто не вписывался в мой инструмент :( В любом случае спасибо вам большое! – okaisan1

0

Вы можете использовать java.nio.file.Files.walkFileTree

import java.io.File; 
import java.io.IOException; 
import java.nio.file.FileVisitResult; 
import java.nio.file.Files; 
import java.nio.file.Path; 
import java.nio.file.Paths; 
import java.nio.file.SimpleFileVisitor; 
import java.nio.file.attribute.BasicFileAttributes; 
import java.util.ArrayList; 
import java.util.List; 

public class FolderRecurs { 
    public Path pathToStart = Paths.get("The_URI_OF_THE_ROOT_DIRECTORY"); 
    public List<File> listPDF = new ArrayList<>(); 
    public FolderRecurs(Path pathToStart) { 
     this.pathToStart = pathToStart; 
    } 

    public void goRecurs() throws IOException{ 
     Files.walkFileTree(pathToStart, new SimpleFileVisitor<Path>() { 
       //for folders 
       @Override 
       public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs){ 
        boolean error = false; 
        //your code 
        return error?FileVisitResult.TERMINATE : FileVisitResult.CONTINUE; 
       } 
       //for files 
       @Override 
       public FileVisitResult visitFile(Path filePath, BasicFileAttributes attrs){ 
        boolean error = false; 
        //Convert path to file 
        File file = filePath.toFile(); 
        if (file.getName().endsWith((".pdf"))){ 
         listPDF.add(file); 
        } 
        //your code 
        return error?FileVisitResult.TERMINATE : FileVisitResult.CONTINUE; 
       } 
     }); 
    } 
} 
Смежные вопросы