2016-06-05 2 views
0

Предположим, моя структура каталогов выглядит следующим образом: -
Главная папка
1.file1
2.Folder1
2.1 файл2
2,2 файл3
2,3 file4
3 file5
4.Folder2
4.1 file6
4,2 file7как получить общее количество файлов, находящихся в главном каталоге и в подкаталоге, работая everytype структуры в Java

Внутри основной папки общих файлов являются 7, как я знаю, структура поэтому не может писать код, чтобы вычислить общее количество файлов в основной папке

 public class FileIo { 
     public static void main(String[] args) throws IOException { 
     int count1=0; 
     File f=new File("C:\\Users\\omshanti\\Desktop","mainfolder"); 
     String[] s=f.list(); 
     for(String s1:s){ 
      File f1=new File(f,s1); 
      if(f1.isFile()){ 
       count1++; 
      } 
      if(f1.isDirectory()){ 
         int subdirfilelength=f1.list().length; 
        count1=count1+subdirfilelength; 
       } 

      } 
     System.out.println("total no of files in h1 folder "+count1);   


    } 
} 

выше код работает правильно и дать общее количество файлов в 7
, но если я не знаю структуру файла и папки внутри главной папки также содержит вложенную папку и папка содержит файл, поэтому выше кода не давать правильные ответы,
, например: -
Главная папка
1.file1
2.Folder1
2.1 subfolder1
2.1.1 SubFolderOfSubFolder
2.1.1.1 файл2
2.1.1.2 файл3
2.1.1.3 file4 2,2 file5
3 file6
4 .Folder2
4.1 file7
4.2 file8
здесь не общее количество файлов 8, но выше код не

наконец я получил это решение

  int count1=0; 
      File f=new File("C:\\Users\\omshanti\\Desktop","h1"); 
      String[] s=f.list(); 
      for(int i=0;i<s.length;i++){ 
       File f1=new File(f,s[i]); 
       if(f1.isFile()){ 
        count1++; 

       } 
       else if(f1.isDirectory()){ 
          String[] subdir1=f1.list(); 
          for(int j=0;j<subdir1.length;j++){ 
           File f2 = new File(f1, subdir1[j]); 
           if (f2.isFile()) { 
            count1++; 


           } 
           else if(f2.isDirectory()){ 
            String[] subdir2=f2.list(); 
          for(int k=0;k<subdir2.length;k++){ 
           File f3 = new File(f2, subdir2[k]); 

           if (f3.isFile()) { 
            count1++; 


           } 
           else if(f3.isDirectory()) 
           { 
          String[] subdir3=f3.list(); 
            for (String subdir31 : subdir3) { 
             File f4 = new File(f3, subdir31); 
             if (f4.isFile()) { 
              count1++; 


             } 
             } 




         } 
        } 

           }}} 

       } 
      System.out.println("total no of files in h1 folder "+count1);   
+1

[Walking Дерево файлов] (https://docs.oracle.com/javase/tutorial/essential/io/walk.html). Вы также можете провести некоторое исследование рекурсии метода (вызовы рекурсивного метода) – MadProgrammer

+1

Для [пример] (http://stackoverflow.com/questions/12505491/list-files-from-directories-and-sub-directories-in- java-including-only-partial-f/12505570 # 12505570), [пример] (http://stackoverflow.com/questions/28580764/listfiles-in-java-fails-to-get-all-files/28581269#28581269) – MadProgrammer

ответ

0

Вы можете использовать Apache Commons-Ио FileUtils.listFiles для этого:

List<File> files = (List<File>) FileUtils.listFiles(new File("/your/path"), TrueFileFilter.INSTANCE, TrueFileFilter.INSTANCE); 
int nbFiles = files.size(); 

Их Javadoc говорит:

Находит файлы в пределах заданного каталога (и необязательно его подкаталоги ).

Первый параметр - ваш путь. Второй устанавливает флаг для поиска файлов. Третий устанавливает флаг для «просмотра каталогов», таким образом проходя через подкаталоги.

Вам понадобится следующая зависимость в мавена:

<dependency> 
    <groupId>commons-io</groupId> 
    <artifactId>commons-io</artifactId> 
    <version>2.4</version> 
</dependency> 

или загрузить банку здесь и добавить его к классам: commons-io:commons-io:2.4 (или direct link to download)

FileUtils JavaDoc на Apache's site

+0

Я решил проблему самостоятельно простым способом –

+0

Вы могли бы опубликовать то, что вы сделали (возможно, добавьте раздел «Изменить» на свой вопрос?) – alexbt

+0

good. Я лично считаю, что 2 лайнера с commons-io являются более элегантными, но эй, если это вам подходит. Для информации, а не FileUtils.listFiles, если содержимое слишком велико, вы также можете использовать FileUtils.iterateFilesAndDirs и итерации вручную. – alexbt