18

ディレクトリの下にあるすべてのファイル、特にサブディレクトリを含むすべてのファイルのリストを収集したいと思います。私は自分で物事をするのが好きではないので、ApacheCommonsIOFileUtils.listFilesから使用しています。だから私は次のようなものを持っています:

import java.io.File;
import java.util.Collection;

import org.apache.commons.io.FileUtils;
import org.apache.commons.io.filefilter.TrueFileFilter;

public class TestListFiles {
  public static void main(String[] args) {
    Collection<File> found = FileUtils.listFiles(new File("foo"),
        TrueFileFilter.INSTANCE, TrueFileFilter.INSTANCE);
    for (File f : found) {
      System.out.println("Found file: " + f);
    }
  }
}

問題は、これは通常のファイルのみを検索し、ディレクトリは検索しないように見えることです。

$ mkdir -p foo/bar/baz; touch foo/one_file
$ java -classpath commons-io-1.4.jar:. TestListFiles
Found file: foo/one_file

私はすでにTrueFileFilter両方のフィルターに合格しているので、これ以上包括的なものは考えられません。私はそれをリストしたい:("foo", "foo/one_file", "foo/bar", "foo/bar/baz"任意の順序で)。

非ソリューションも受け入れFileUtilsますが、独自のBFSを作成する必要がある、または取得したリストから親ディレクトリのセットを収集する必要があるのはばかげているようです。(とにかく空のサブディレクトリを見逃してしまいます。)これはLinux、FWIWにあります。

4

6 に答える 6

21

古い答えですが、これは私にとってはうまくいきます:

FileUtils.listFilesAndDirs(new File(dir), TrueFileFilter.INSTANCE, DirectoryFileFilter.DIRECTORY);

両方を示します:

私が使う:

FileUtils.listFilesAndDirs(new File(dir), new NotFileFilter(TrueFileFilter.INSTANCE), DirectoryFileFilter.DIRECTORY)

ディレクトリのみを表示し、ファイルは表示しません...

于 2012-10-17T16:21:08.433 に答える
8

簡単に試しましたか:

File rootFolder = new File(...);
File[] folders = rootFolder.listFiles((FileFilter) FileFilterUtils.directoryFileFilter());

それは私のために働くようです。もちろん、再帰が必要です。

それが役に立てば幸い。

于 2011-02-01T10:24:30.173 に答える
6

ソース コードを見て、JavaDoc の行間を読むと、残念ながら、この API は意図したとおりに設計されていないことがわかります。指定された引数に一致するファイルのリスト (ファイルとディレクトリのリストではありません)返します。ソース コードでは、メソッドinnerListFilesを見てください。ディレクトリが検索され、結果リストに追加されていないことがわかります。

あなたが望むことをする公開APIを知りません。うまくいけば、他の誰かが1つを知っているでしょう。ほとんどの場合、BFS ではなく DFS である可能性があります。(これまでに見た Java コードはすべて、ディレクトリ ツリー トラバーサルを深さ優先検索で実行していました。もちろん、BFS が存在しないという意味ではありません。)

特定のディレクトリの下にあるすべてのリストが本当に必要な場合は、自分で作成するのは簡単です。しかし、車輪の再発明をしたくないというあなたの願いは理解できます。

注:必要なものはApache Commons Finderでサポートされる可能性がありますが、このライブラリは The Commons Sandbox にあるため、この段階ではより実験的なものです。完全である場合とそうでない場合があり、維持される場合と維持されない場合があります。また、探しているものには重量があるかもしれません。

于 2009-05-23T02:45:50.037 に答える
6

私は自明でないアプリケーションのほとんどで Java IO ライブラリを避け、代わりに Commons VFS を好みます。適切なパラメーターを使用してこのメ​​ソッドを呼び出すと、目的が達成されると思いますが、機能を実現するにはまだ長い道のりがあります。

具体的には、このコードはあなたが望むことを行います:

    FileObject[] files = fileObject.findFiles(new FileSelector() {
        public boolean includeFile(FileSelectInfo fileInfo)  {
            return fileInfo.getFile().getType() == FileType.FOLDER; }

        public boolean traverseDescendents(FileSelectInfo fileInfo) {
            return true;
        }
    });

ここで、fileObject は FileObject のインスタンスです。

于 2009-05-23T04:23:54.880 に答える
1

より簡単で完全なCommons VFSソリューション:

FileSystemManager fsManager = VFS.getManager();
FileObject fileObject = fsManager.resolveFile( "yourFileNameHere" );
FileObject[] files = fileObject.findFiles( new FileTypeSelector( FileType.FOLDER ) )
于 2010-02-05T23:53:21.307 に答える
0

APIに基づいて動作するはずです。

これは私自身のバージョンのFileUtilsで、Commons IO ほど完全ではなく、必要なものだけが含まれています。findFilesを検索するか、 iterateを使用して巨大なリストを作成しないようにすることができます (時々/ほとんどの場合、それらのファイルで何かをしたいだけなので、それらをリストに収集しても意味がありません)。

于 2009-05-23T02:32:49.313 に答える