2016年11月21日月曜日

ディレクトリのコピー

みなさん。 こんばんは。

前回はファイルツリーの走査のサンプルを見ましたが、今回はもう少し役に立つサンプルとしてディレクトリのコピーについて見てみましょう。

ディレクトリのコピーを行うには、次に示す手順で行います。

  1. ディレクトリをコピーする。このとき、ディレクトリに存在するファイル/ディレクトリはコピーされない。
  2. ディレクトリに存在するファイルをコピーする。
  3. サブディレクトリが存在したら、①に戻る。サブディレクトリがなくなるまで①と②を繰り返す。
ファイルツリーの走査を使用して、この手順を実現していきます。

①は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メソッドを使用してファイル名の解決を行っています。

今回はファイルツリーの走査をしてディレクトリのコピーをするサンプルを記述しました。

では今日はこの辺で!

人気ブログランキングへ

0 件のコメント:

コメントを投稿