2016-12-11 4 views
1

Я хочу перечислить файлы .rar в папке и вложенных папках до тех пор, пока не останется никаких папок.Как рекурсивно перечислить все файлы .rar в каталоге

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

private String getFileNums(File file) { 
     if (file.isDirectory()) { 
      File[] list = file.listFiles(new FilenameFilter() { 
       @Override 
       public boolean accept(File file, String s) { 
        return s.toLowerCase().endsWith(".rar"); 
       } 
      }); 
      int count = 0; 
      if (list != null) { 
       for (File f : list) { 
        if (f.isDirectory()) { 
         getFileNums(f); 
        } else { 
         count++; 
        } 
       } 
      } 
      return "Number of rar files in this folder and subfolders is " + count; 
     } else { 
      long length = file.length(); 
      return "File size in bytes is " + length;); 
     } 
    } 

У меня есть проблема с этим кодом является то, что он не перечисляет .rar файлов в подпапках, это только список тех, кто в непосредственной папке.

Например сказать House папка, которая содержит Bedroom (папку), Kitchen (папка), chair.rar (RAR-файл) и door.rar (файл RAR). Вышеуказанный код только chair.rar и door.rar, он не перечисляет файлы rar в Bedroom и Kitchen папках.

Пожалуйста, есть ли там, где это можно исправить?

ответ

4

Проблема с вашим FilenameFilter. Он отфильтровывает каталоги, чье имя не заканчивается на «.rar», а в большинстве каталогов нет. Вам нужно убедиться, что они пропускают фильтр.

new FilenameFilter() { 
    @Override 
    public boolean accept(File dir, String filename) { 
     // create a file object to check whether we are looking at a directory. 
     File f = new File(dir, filename); 
     return f.isDirectory() || filename.toLowerCase().endsWith(".rar"); 
    } 
} 

Прочитав ваш комментарий, я понял, что ваш код не сможет «подключить» рекурсию.

int count = 0; 

if (f.isDirectory()) { 
    // Nothing comes out of the recursive call. 
    // The result is completely lost 
    getFileNums(f); 
} 

Кроме того, вы хотите, чтобы вернуться int вместо String для метода, подсчитывать количество RAR файлов рекурсивно.

private int getFileNums(File file) { 
    if (file.isDirectory()) { 
     File [] files = file.listFiles(); 
     if (files != null) { 
      int count = 0; 
      for (File f : files) { 
       if (f.isDirectory()) { 
        count += getFileNums(f); 
       } else if (f.getName().toLowerCase().endswith(".rar")) { 
        count++; 
       } 
      } 
      return count; 
     } else { 
      return 0; 
     } 
    } else { 
     throw new IllegalArgumentException("Expecting a directory."); 
    } 
} 

Если вы используете Java 8

Вы можете использовать Files.walk.

import java.nio.file.*; 

long numOfRar = Files.walk(file.toPath(), FileVisitOption.FOLLOW_LINKS) 
        .filter(p->p.toString().toLowerCase().endsWith(".rar")) 
        .count(); 
+0

Спасибо. Я не использую Java 8 из-за мгновенного запуска, поэтому я только попробовал первый ответ, но это не имело никакого значения. – X09

+0

Спасибо человек. Он работает сейчас. – X09

1

Иногда легче видеть вещи в Псевдокоде. Я так думаю.

processDirectory(thisDir) 
    for each entry in thisDir 
    if (entry is directory) 
     processDirectory(entry) // Recurse. 
    else if (entry is .rar file) 
     processRarFile(entry) 
    endif 
    endfor 
end 

Ваш код не соответствует этому образцу, как указал Люк.

Смежные вопросы