使用Files.move()时出现java.nio.file.AccessDeniedException

6

我正在进行一个java.nio.file.Files.move(path, path.resolveSibling("newfilename"))操作,用于在Windows 7上重命名一个目录。

但是我遇到了以下异常:

java.nio.file.AccessDeniedException: oldfilename -> newfilename
    at sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:83)
    at sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:97)
    at sun.nio.fs.WindowsFileCopy.move(WindowsFileCopy.java:387)
    at sun.nio.fs.WindowsFileSystemProvider.move(WindowsFileSystemProvider.java:287)
    at java.nio.file.Files.move(Files.java:1345)

这是什么原因?我正在使用Java 7。
在调用Files.move()之前,目标路径不存在。 更新javadoc中得知:
When moving a directory requires that its entries be moved then this method fails
(by throwing an IOException).

我的目录非空,并且包含常规文件,所以也许这就是它不能在这里使用的原因?我不太理解“需要移动其条目”的措辞。什么情况下会出现这种情况?


UAC 不能是原因吗? - Natix
我必须更改所有相关文件夹的所有权(即使资源管理器移动文件没有问题)。旧的“所有者”是以S-1-5-21-开头的一些长SID。奇怪的是,当本地用户具有权限时,由该用户启动的Java应用程序却没有权限。 - Mark Jeronimus
这是帮助我的内容:https://dev59.com/8F4b5IYBdhLWcg3wzUYp#28673369 - Yster
6个回答

9

当目标目录在Windows资源管理器中打开时,我遇到了这个问题。关闭Windows资源管理器后,问题得以解决。


这对我很有帮助,即使其他文件夹没有打开目标文件夹。相当奇怪。 - BullyWiiPlaza
谢谢!我陷入它很久了:D。 - samarendra chandan bindu Dash

3

由于这是Windows操作系统,可能目标路径已存在并被其他进程使用。


目标路径不存在。 - MRalwasser

3

好的,所以我一直在尝试自己解决同样的异常,虽然这个问题已经两年了,但我会把答案发布出来,因为别人可能会觉得有用。

我发现我的文件被标记为“只读”,取消勾选后一切正常。


1
我找到了答案。 在我的情况下,这是因为该目录在Windows资源管理器中打开。
在某些情况下,Windows会尝试加载预览,并在文件上放置一个标志以防止删除它。
我正在谈论这个图标:enter image description here 您可以取消选择该图标或仅关闭Windows资源管理器,问题就解决了。

1
我的目录不为空,包含常规文件,所以可能这就是不能在此处使用的原因?我无法理解“要求其条目被移动”的措辞。什么情况下会出现这种情况?
当将目录移动到同一硬盘驱动器(和同一分区)的其他位置时,文件不必移动。 Files.move() 方法所做的基本上是重命名目录并保留文件不变。
顺便说一句,您可能会因为该目录中的文件当前正在被您自己或其他应用程序读取而收到此异常。

0

在我的情况下,目标文件夹已经存在,所以我先删除了它,然后移动源文件夹。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接