0

任意のディレクトリまたはドライブにあるファイルを検索する必要があります。すべてのオペレーティングシステムと互換性がある必要があります。私がグーグルで検索したとき、ほとんどのコードは特定のディレクトリを反復処理しますが、完全なファイルシステムは反復処理しません。それを効率的に行う方法はありますか?どんな助けや提案も本当にありがたいです。

以下のコードはhttp://www.mkyong.com/java/how-to-traverse-a-directory-structure-in-java/から取得したものですが、パラメーターとしていくつかのディレクトリを渡す必要があります。すべての場所を取得するために一般化する方法はありますか?

public static void main (String args[]) {

    displayIt(new File("C:\\"));
}

public static void displayIt(File node){

    System.out.println(node.getAbsoluteFile());

    if(node.isDirectory()){
        String[] subNote = node.list();
        for(String filename : subNote){
            displayIt(new File(node, filename));
        }
}
4

3 に答える 3

3

Apache Commons-IO は、この種の操作に適した API です。Unix システムではルート "/" を使用できますが、これは Windows では使用できません。したがって、すべてのルートを要求してそれらを反復処理する必要があります。

File[] roots = File.listRoots();

Collection<File> files = new ArrayList<File>();    

for(File root : roots) {
    files.addAll(FileUtils.listFiles(
      root, 
      new RegexFileFilter(<your regex filter>), 
      DirectoryFileFilter.DIRECTORY
    ));
} 
于 2012-10-16T08:30:30.043 に答える
1

この種のコード スニペットは、ディレクトリとサブ ディレクトリ内のすべてのファイルを一覧表示します。ファイルを allFiles に追加する必要はなく、そこでチェックを行うことができます。まだコードを提供していないので (何も試していないと思います)、更新させていただきます ;)

private void addFiles(File file, Collection<File> allFiles) {
    File[] files = file.listFiles();
    if (files != null) {
       for (File f : files) {
           allFiles.add(f);
           addFiles(f, allFiles);
       }
    }
}
于 2012-10-16T08:30:38.060 に答える
0

再帰でこれを行いたい場合は、DFS のコードを次に示します。コードが機能しない可能性があり (テストしたことはありません)、最適化されていませんが、問題を解決する方法についていくつかのアイデアが得られる可能性があります。

File find(String directoryName, String pattern)
{
 File currentDirectory = loadFile(directoryName);

for (String name: currentDirectory .list())
{
File children = loadFile(name)

if (children.isDirectory())
{
 File file = find(name, pattern)
 if (file !=null)
 {
  return file;
 }
}
else
{
 if (match(name,pattern)
  {
   return children;
  }
}
}
return null;

}
于 2012-10-16T08:51:47.883 に答える