2013-08-13 5 views
1

Привет, я хотел бы обрабатывать файлы внутри многих подкаталогов с помощью Java. Псевдопользователей код будетРекурсивно обрабатывать те же файлы внутри многих подкаталогов в Java

while(mainDir.hasMoreDirectory()) 
{ 
    getFilesFromCurrentDirectory() 
    passThoseFilesAsArgumentToProcess() 
} 

В настоящее время я использую следующий код

public void list(File file) { 
    System.out.println(file.getName()); 
    File[] children = file.listFiles(); 
    for (File child : children) { 
     list(child); 
    } 
} 

Над кодом просто перечислены файлы. Другая вещь, которую я могу сделать, - это сохранить список файлов и каталогов в списке, а затем обработать в другом цикле. Но я не могу придумать то, что хочу, как показать в псевдокоде. Я новичок в каталогах файлов, пожалуйста, помогите. Заранее спасибо.

+0

Вы используете Java 7? –

+0

Вас интересуют только определенные файлы в этих каталогах или все они? –

+0

Привет @ Marc-Andre Да, я использую Java 7. – u449355

ответ

3

Если вы используете Java 7, вы можете использовать расширенные функциональные возможности НИО в виде метода Files.walkFileTree. Перемещение файловой системы никогда не было проще в Java.

Существует короткий учебник по его использованию here.

Он реализует шаблон посетителя, поэтому вам не нужно беспокоиться об алгоритме обхода, указывая только то, что вы хотите делать с каждой записью.

0

Будет ли после?

public void list(File file) { 
    File[] children = file.listFiles(); 

    if (children != null) { 
     process(children); 

     for (File child : children) { 
      if (child.isDirectory()) { 
       list(child); 
      } 
     } 
    } else { 
     process(new File[]{file}); 
    } 
} 

private void process(File[] children) { 
    for (File child : children) { 
     if (child.isFile()) { 
      // process normal file 
     } 
    } 
} 
0

метод, как это будет возвращать вам List всех файлов рекурсивно в каталоге. Вы можете работать с возвратом List или заменить вызовы rtn.add своей обработкой.

Опасайтесь, чтобы этот метод не имел ничего, чтобы остановить его застревание в круговых символических ссылках.

public static List<File> getFilesRecursive(File s) 
{ 
    ArrayList<File> rtn = new ArrayList<File>(); 
    File[] contents = s.listFiles(); 
    for(int i = 0; i<contents.length; i++) 
    { 
     if(contents[i].isDirectory()){ 
      rtn.addAll(getFilesRecursive(contents[i])); 
     }else{ 
      rtn.add(contents[i]); 
     } 
    } 
    return rtn; 
} 
0

Может быть, этот кусок кода поможет вам:

public void traverse(String path) { 
    File root = new File(path); 
    File[] list = root.listFiles(); 
    if (list == null) return; 

    for (File file : list) { 
     if (file.isDirectory()) { 
      traverse(file.getAbsolutePath()); 
      System.out.println("Directory: " + file.getAbsoluteFile()); 
     } else { 
      System.out.println("File: " + file.getAbsoluteFile()); 
     } 
    } 
} 
0
private static List<File> allFiles = new ArrayList<File>(); 

private static void processFiles(String rootDirectory) { 
    File rootDir = new File(rootDirectory); 
    if (rootDir.exists()) { 
     traverseDirectories(rootDir); 
    } 
} 

private static void traverseDirectories(File file) { 
    // add all files and directories to list. 
    allFiles.add(file); 
    if (file.isDirectory()) { 
     File[] fileList = file.listFiles(); 
     for (File fileHandle : fileList) { 
      traverseDirectories(fileHandle); 
     } 
    } else { 
     // call to process file 
     System.out.println("Call to process file " + file.getAbsolutePath()); 
    } 
} 
1

При перемещении дерева каталогов в Java 7 используйте функции Paths и Files. Они не только облегчают чтение каталогов и файлов, но и быстрее, чем «старый» File.

Предположим, у вас есть два каталога: mainDir и otherDir, и вы хотите пройти через все каталоги mainDir до его листьев. С каждой записью в maiondir (файл, подкаталог, символическая ссылка, ...) вы хотите сравнить эту запись и ее атрибуты (размер, время модификации ...) с записью в той же позиции в otherDir. Тогда это будет ваш код:

public final void test() throws IOException, InterruptedException { 
    final Path mainDir = Paths.get("absolute path to your main directory to read from"); 
    final Path otherDir = Paths.get("absolute path to your other directory to compare"); 

    // Walk thru mainDir directory 
    Files.walkFileTree(mainDir, new FileVisitor<Path>() { 
     @Override 
     public FileVisitResult preVisitDirectory(Path path, 
       BasicFileAttributes atts) throws IOException { 
      return visitFile(path, atts); 
     } 

     @Override 
     public FileVisitResult visitFile(Path path, BasicFileAttributes mainAtts) 
       throws IOException { 
      // I've seen two implementations on windows and MacOSX. One has passed the relative path, one the absolute path. 
      // This works in both cases 
      Path relativePath = mainDir.relativize(mainDir.resolve(path)); 

      BasicFileAttributes otherAtts = Files.readAttributes(otherDir.resolve(relativePath), BasicFileAttributes.class); 

      // Do your comparison logic here: 
      compareEntries(mainDir, otherDir, relativePath, mainAtts, otherAtts); 

      return FileVisitResult.CONTINUE; 
     } 

     @Override 
     public FileVisitResult postVisitDirectory(Path path, 
       IOException exc) throws IOException { 
      // TODO Auto-generated method stub 
      return FileVisitResult.CONTINUE; 
     } 

     @Override 
     public FileVisitResult visitFileFailed(Path path, IOException exc) 
       throws IOException { 
      exc.printStackTrace(); 

      // If the root directory has failed it makes no sense to continue 
      return (path.equals(mainDir))? FileVisitResult.TERMINATE:FileVisitResult.CONTINUE; 
     } 
    }); 
} 

Что не делает:

  • Найти записи, которые существуют в otherDir, но не в maindir
  • Path и BasicFileAttributes не Serializable, так нет простого способа сделать эту прогулку на двух разных машинах.
Смежные вопросы