前回はファイルツリーの走査のサンプルを見ましたが、今回はもう少し役に立つサンプルとしてディレクトリのコピーについて見てみましょう。
ディレクトリのコピーを行うには、次に示す手順で行います。
- ディレクトリをコピーする。このとき、ディレクトリに存在するファイル/ディレクトリはコピーされない。
- ディレクトリに存在するファイルをコピーする。
- サブディレクトリが存在したら、①に戻る。サブディレクトリがなくなるまで①と②を繰り返す。
ファイルツリーの走査を使用して、この手順を実現していきます。
①はpreVisitDirectoryメソッドで処理可能です。
次の②はvisitFileメソッドで実装できます。
③に関してはwalkFileTreeメソッドの内部で制御する処理なので、実装はありません。
ということは、preVisitDirectoryメソッドとvisitFileメソッドを実装したFileVisitorオブジェクトを生成すればよいことになります。
postVisitDirectoryメソッドなどは実装する必要がないため、ここではSimpleFileVisitorクラスの匿名クラスとして実装してみます。
// ディレクトリのコピー
// コピー元のディレクトリ
Path source = Paths.get(sourceDirectory);
// コピー先のディレクトリ
Path dest = Paths.get(destDirectory);
// ファイルツリーをたどって、ファイル/ディレクトリをコピーするFileVisitor
FileVisitor<Path> visitor = new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs)
throws IOException {
// ディレクトリのコピー
Files.copy(dir, dest.resolve(dir), StandardCopyOption.COPY_ATTRIBUTES);
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
throws IOException {
// ファイルをコピー
Files.copy(file, dest.resolve(file), StandardCopyOption.COPY_ATTRIBUTES);
return FileVisitResult.CONTINUE;
}
};
// ディレクトリのコピーを実行!!Files.walkFileTree(source, visitor);
上記のpreVisitDirectoryでは、ディレクトリのコピーをcopyメソッドを使用して行っています。
コピー先のディレクトリ名を解決するために使用しているのが、Pathインターフェースのresolveメソッドです。
resolveメソッドはディレクトリに対するコピーはディレクトリだけをコピーし、ディレクトリにあるファイルはコピーしません。
ファイルツリーに存在するファイルに到達するとvisitFileメソッドがコールされるので、このときにファイルのコピーを行います。
このときも、resolveメソッドを使用してファイル名の解決を行っています。
今回はファイルツリーの走査をしてディレクトリのコピーをするサンプルを記述しました。
では今日はこの辺で!
人気ブログランキングへ
コピー先のディレクトリ名を解決するために使用しているのが、Pathインターフェースのresolveメソッドです。
resolveメソッドはディレクトリに対するコピーはディレクトリだけをコピーし、ディレクトリにあるファイルはコピーしません。
ファイルツリーに存在するファイルに到達するとvisitFileメソッドがコールされるので、このときにファイルのコピーを行います。
このときも、resolveメソッドを使用してファイル名の解決を行っています。
今回はファイルツリーの走査をしてディレクトリのコピーをするサンプルを記述しました。
では今日はこの辺で!
0 件のコメント:
コメントを投稿