Files.move()とは
ディレクトリの移動、もしくはディレクトリ名を変更する際に使用される
また、ファイル名の変更は「File.renameTo」でも可能である
Filesクラスが使用できるなら、Fileクラスは極力使用しないことをお勧めする
■ファイルを移動、ファイル名の変更
「C:\tmp\test.txt」を「C:\tmp2」に移動、かつファイル名を「test2」に変更する
val oldPath = Paths.get("C:\\tmp\\test.txt")
val newPath = Paths.get("C:\\tmp2\\test2.txt")
Files.move(oldPath, newPath)
■ディレクトリを移動、ディレクトリ名の変更
「C:\tmp」を「C:\tmp2」に移動、かつファイル名を「test2」に変更する
val oldPath = Paths.get("C:\\tmp")
val newPath = Paths.get("C:\\tmp2")
Files.move(oldPath, newPath)
上記の場合は問題ないが、、、
ディレクトリが空でない場合、「AccessDeniedException」が発生する場合がある
その場合は、別の方法を考える必要が生じる。
それは、「Files.copy」と「Files.walkFileTree」の合わせ技を使用する方法だ。
(なお、この方法は「Filesクラス」のJavaDocに記載がある)
■概要
Files.copyでは、コピー元とコピー先のパスを指定し、複製することができる。
また、コピー先のパスでは、ファイル名を変更して指定ができる。
Files.walkFileTreeでは、指定したディレクトリ以下のファイルパスをまとめて取得できる。
そのため、Files.copyと併用し、すべてのファイルを指定のコピー先に複製できる。
(もちろん、フォルダも複製が可能である)
■サンプルコード
val oldPathStr = "C:\\tmp"
val newPathStr = "C:\\tmp2"
Files.walk(oldPath).forEach {
val oldPath = it.toString()
val replacePath = oldPath.replace(oldPathStr, newPathStr)
Files.copy(it, replacePath)
}
■結果
処理前:C:\\tmp\\test.txt
処理後:C:\\tmp2\\test.txt