このエントリーをはてなブックマークに追加


サブディレクトリ内を含むファイル一覧を取得するサンプル

Javaで指定したディレクトリ内のファイル一覧を取得するサンプルソースです。
再帰呼出しにより、サブディレクトリ内のファイル一覧も取得します。

関連記事

サンプルソース

getFileList()メソッドを再帰呼出しすることにより、サブディレクトリ内のファイル一覧を取得しています。
尚、本サンプルプログラムは以下の引数を必要とします。

java RecursiveFileList ディレクトリ [サブディレクトリの深さ・省略可能]

使用例として以下のようになります。

java RecursiveFileList . 1

上記の例では、カレントディレクトリで深さ=1なので、サブディレクトリを検索しません。
(lsやdirをオプションなしで実行した時と同じ動作になります。)

java RecursiveFileList .

深さを指定しないと、カレントディレクトリ以下のファイルやディレクトリすべてを表示します。

java RecursiveFileList . 2

カレントディレクトリとカレントディレクトリ内のサブフォルダ内ファイルまでが対象となります。

fileRecursiveFileList.java LF

import java.io.File;
import java.util.List;
import java.util.ArrayList;

class RecursiveFileList {
    int depth;
    String directory;

    private static void usage() {
        System.err.println("Usage: java RecursiveFileList <path> [depth]");
        System.exit(1);
    }

    private static boolean isNum(String v) {
        boolean b = true;
        try {
            Integer.parseInt(v);
        } catch (NumberFormatException e) {
            b = false;
        }
        return b;
    }

    private int getDepth() {
        return this.depth;
    }

    private void setDepth(int d) {
        this.depth = d;
    }

    private void setDirectory(String d) {
        this.directory = d;
    }

    private String getDirectory() {
        return this.directory;
    }

    private List<File> getFileList(String dir, List<File> fileList, int dirDepth) {
        File f = new File(dir);
        File[] fl = f.listFiles();
        if (fl != null) {
            for (File item : fl) {
                fileList.add(item);
                if (item.isDirectory()) {
                    if ((getDepth() > (dirDepth+1)) || (getDepth() == 0)) {
                        getFileList(dir + System.getProperty("file.separator") + item.getName(), fileList, dirDepth+1);
                    }
                }
            }
        }
        return fileList;
    }

    RecursiveFileList(String dir, int depth) {
        setDepth(depth);
        setDirectory(dir);
    }

    public static void main(String[] args) {
        int depth = 0;
        // check arguemnts
        if ((args.length !=1) && (args.length !=2)) {
            usage();
        }
        // check numeric
        if (args.length == 2) {
            if (!isNum(args[1])) {
                System.err.println(args[1] +" is not numeric.");
                usage();
            }
            if (Integer.parseInt(args[1]) < 0) {
                System.err.println("Please enter a number greater than 1.");
                usage();
            }
            depth = Integer.parseInt(args[1]); // sub directory depth
        }
        // directory ?
        File f = new File(args[0]);
        if (!f.exists()) {  // false
            System.out.println(args[0] + " directory is not found.");
            System.exit(2);
        }
        if (f.isFile()) {
            System.out.println(args[0] + " is file, Please set the directory.");
            System.exit(3);
        }
        if(!f.isDirectory()) {
            System.out.println(args[0] + " is unknown, Please set the directory.");
            System.exit(4);
        }

        RecursiveFileList me = new RecursiveFileList(args[0], depth);
        List<File> fileList = new ArrayList<File>();
        me.getFileList(args[0], fileList, 0);
        for (File fitem : fileList) {
            System.out.println(fitem.getPath());
        }
    }
}

実行結果

コンパイルして実行してみます。

  • コンパイルします。
    $ javac RecursiveFileList.java 
  1. 引数を指定しないと以下のようにUsageが表示されます。
    $ java RecursiveFileList 
    Usage: java RecursiveFileList <path> [depth]
  2. テスト用のディレクトリを作成します。
    $ mkdir -p dirA1/{dirA2-1,dirA2-2/dirA3} dirB1
    $ tree 
    .
    ├── RecursiveFileList.class
    ├── RecursiveFileList.java
    ├── dirA1
    │   ├── dirA2-1
    │   └── dirA2-2
    │       └── dirA3
    └── dirB1
    
    5 directories, 2 files
  3. テスト用のファイルを作成します。
    $ touch dirA1/fileA1 dirA1/dirA2-1/fileA2-1 dirA1/dirA2-2/dirA3/{fileA3-1,filea3-2}
    $ tree 
    .
    ├── RecursiveFileList.class
    ├── RecursiveFileList.java
    ├── dirA1
    │   ├── dirA2-1
    │   │   └── fileA2-1
    │   ├── dirA2-2
    │   │   └── dirA3
    │   │       ├── fileA3-1
    │   │       └── filea3-2
    │   └── fileA1
    └── dirB1
    
    5 directories, 6 files
  4. 実行してみます。
    $ java RecursiveFileList .
    ./RecursiveFileList.class
    ./dirA1
    ./dirA1/dirA2-1
    ./dirA1/dirA2-1/fileA2-1
    ./dirA1/fileA1
    ./dirA1/dirA2-2
    ./dirA1/dirA2-2/dirA3
    ./dirA1/dirA2-2/dirA3/fileA3-1
    ./dirA1/dirA2-2/dirA3/filea3-2
    ./RecursiveFileList.java
    ./dirB1
     
    $ java RecursiveFileList . 1
    ./RecursiveFileList.class
    ./dirA1
    ./RecursiveFileList.java
    ./dirB1
     
    $ java RecursiveFileList . 2
    ./RecursiveFileList.class
    ./dirA1
    ./dirA1/dirA2-1
    ./dirA1/fileA1
    ./dirA1/dirA2-2
    ./RecursiveFileList.java
    ./dirB1

以上、再帰呼出を使った指定したディレクトリ以下サブディレクトリ内ファイルを含む
ファイルおよびディレクトリ一覧を表示するサンプルソースでした。


添付ファイル: fileRecursiveFileList.java 26件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-07-16 (日) 00:56:15 (458d)