LoginSignup
0
0

Files.move使用時、AccessDeniedExceptionが発生する

Last updated at Posted at 2024-06-26

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0