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

时间:2014-04-10 12:33:35

标签: java file nio

我正在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()之前,目标路径不存在。

更新

From javadoc

When moving a directory requires that its entries be moved then this method fails
(by throwing an IOException).

我的目录是非空的并且包含常规文件,所以也许这就是它不能在这里使用的原因?我在理解“要求移动其条目”的措辞方面遇到了问题。这是什么情况?

7 个答案:

答案 0 :(得分:6)

在Windows资源管理器中打开目标目录时出现此问题。关闭Windows资源管理器使其正常工作。

答案 1 :(得分:2)

由于它是Windows,可能是目标路径存在并且正在被另一个进程使用..

答案 2 :(得分:1)

当其中一个路径是文件而另一个路径是目录时,我有同样的异常调用Files.move(path1, path2, StandardCopyOption.ATOMIC_MOVE)

答案 3 :(得分:0)

  

我的目录非空并且包含常规文件,所以也许就是这样   它不能在这里使用的原因?我遇到了问题   理解"要求移动其条目"措辞。什么时候   是这样的吗?

当目录移动到同一硬盘驱动器(和同一分区)的其他位置时,不必移动文件。 Files.move()方法的作用是基本上重命名目录并保持文件保持不变。

顺便说一下,您可能会遇到此异常,因为此目录中的文件当前由您自己或其他应用程序读取。

答案 4 :(得分:0)

好的,所以我一直在尝试修复同样的异常,即使这个问题已经过了2年,我也会将其发布给别人可能会觉得有用。

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

答案 5 :(得分:0)

我找到了答案。 在我的情况下,这是因为目录在Windows资源管理器中打开。

在某些情况下,Windows尝试加载预览,在文件上放置一个标志,以防止删除它。

我说的是这个图标:enter image description here

您可以取消选择该图标或只关闭Windows资源管理器,问题就解决了。

答案 6 :(得分:0)

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