2016-12-11 19 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ファイルが表示されないということです、それだけですぐにフォルダのものをリスト:

これは私が現在使用しているコードです。例えば

HouseBedroom(フォルダ)、Kitchen(フォルダ)、chair.rar(RARファイル)とdoor.rar(RARファイル)を含むフォルダであると言います。 上記のコードはchair.rardoor.rarのリストのみですが、BedroomKitchenというフォルダにrarファイルは含まれていません。

これはどこで修正できますか?

答えて

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); 
} 

はまた、あなたは再帰的にRARファイルの数を数える方法はintの代わりStringを返すようにしたいです。あなたは、Java 8

使用している場合は

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."); 
    } 
} 

あなたは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 

ルークが指摘したように、あなたのコードはそのパターンと一致しません。

関連する問題