概要
指定されたディレクトリから再帰的に全てのファイルやサブディレクトリを走査する。
シグネチャは以下である。
Path walkFileTree(Path start,Set<FileVisitOption>,int maxDepth,FileVisitor<? super Path> visitor)throws IOException
-
start
:再帰的な走査を開始するディレクトリのPath
インスタンスを指定する。 -
options
:走査オプションを含むSet<FileVisitOption>
である。
主なオプションとしてFileVisitOption.FOLLOW_LINKS
があり、シンボリックリンク1をたどるかを指定できる。
-
maxDepth
:再帰の深さの最大値を指定する。-
0
を指定:
start
ディレクトリのみを走査する。 -
1
を指定:
start
ディレクトリとその直下のフォルダ、サブディレクトリを走査する。 -
Integer.MAX_VALUE
を指定:
全てのサブディレクトリを再帰的に走査する。
-
-
visitor
:FileVisitor<? super Path>
インタフェースを実装してファイル走査処理を指定する。
FileVisitorインタフェース
FileVisitor
インタフェースには、処理タイミングが異なる以下の4つの抽象メソッドが含まれており、全て実装する必要がある。
-
preVisitDirectory(Path dir, BasicFileAttributes attrs)
:
ディレクトリに入る前に実行される。 -
postVisitDirectory(Path dir, IOException exc)
:
ディレクトリを出た後に実行される。 -
visitFile(Path file, BasicFileAttributes attrs)
:
ファイルに遭遇した時に実行される。 -
visitFileFailed(Path file, IOException exc)
:
ファイルの処理に失敗した時に実行される。
これらのメソッドを実装することで、ファイルツリーの走査中に実行したいアクションを指定できる。
なお、それぞれのメソッドはEnumのjava.nio.file.FiveVisitResult
で定義された以下の定数を返す。
FiveVisitResultの定数
以下4つの定数は、FileVisitor
インタフェースのメソッド内で、ファイルやディレクトリに対するアクションの結果の戻り値に指定する。
-
CONTINUE
:
ファイルやディレクトリの走査を続ける。 -
TERMINATE
:
ファイルやディレクトリの走査を終了(中止)する。 -
SKIP_SUBTREE
:
サブディレクトリの走査をスキップし、直接次のディレクトリに進む。 -
SKIP_SIBLINGS
:
同じ親ディレクトリ内の次のエントリにスキップし、現在のディレクトリの走査を終了する。
これらの定数を使用することで、ファイルツリーの再帰的な走査を制御することができる。
例えば、特定の条件に合致するファイルを見つけた場合に走査を終了したり、特定のディレクトリ以下の走査をスキップするなどである。
例
import java.io.IOException;
import java.nio.file.FileVisitOption;
import java.nio.file.FileVisitResult;
import java.nio.file.FileVisitOption.*;
import java.nio.file.FileVisitResult;
import java.nio.file.FileVisitOption.*;
import java.nio.file.FileVisitResult;
import java.nio.file.FileVisitOption.*;
import java.nio.file.FileVisitor;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.EnumSet;
public class FileVisitorExample implements FileVisitor<Path> {
@Override
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
// ディレクトリに入る前に実行されるアクション
System.out.println("Entering directory: " + dir);
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
// ファイルに対して実行されるアクション
System.out.println("File: " + file);
// 特定の条件に合致するファイルを見つけた場合に走査を終了する例
if (file.getFileName().toString().equals("file3.txt")) {
return FileVisitResult.TERMINATE;
}
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
// ファイルにアクセスできなかった場合に実行されるアクション(スキップ可能)
System.err.println("Failed to visit file: " + file);
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
// ディレクトリを出た後に実行されるアクション
System.out.println("Exiting directory: " + dir);
return FileVisitResult.CONTINUE;
}
public static void main(String[] args) {
Path dirPath = Paths.get("example_directory");
try {
Files.walkFileTree(dirPath, EnumSet.noneOf(FileVisitOption.class), Integer.MAX_VALUE,
new FileVisitorExample());
} catch (IOException e) {
e.printStackTrace();
}
}
}
この例では、FileVisitorExample
クラスがFileVisitor<Path>
インタフェースを実装している。
-
preVisitDirectory()
メソッド内:
ディレクトリに入る前に実行するアクションを指定 -
visitFile()
メソッド内:
ファイルに遭遇した時に実行するアクションを指定 -
postVisitDirectory()
メソッド内:
ディレクトリを出た後に実行するアクションを指定
また、特定の条件に合致するファイル(ここではfile3.txt
)を見つけた場合に走査を終了するために、visitFile()
メソッド内でFileVisitResult.TERMINATE
を返している。
FileVisitor
インタフェースに定義されている4つの抽象メソッドは全て実装しなければならない。
しかし、ファイルを削除したいだけなどシンプルな操作であれば、最低限の実装だけ待つjava.nio.file.SimpleFileVisitor
クラスを使用することで必要なメソッドのみオーバーライドすることができる。
-
ディスク上で扱うファイルなどを本来の位置とは別にファイルを作成し、それを通じてアクセスできるようにする仕組みのこと。Windowsでいうショートカットのイメージ。 ↩