当抛出AccessDeniedException时,为什么使用Files.move()会导致文件被删除?

4

这只是一个概念性问题。我正在使用Files.move()StandardCopyOption.ATOMIC_MOVE选项。我认为这样更安全,但结果当抛出AccessDeniedException时仍然会删除文件。

是否有任何解决方法或解释将不胜感激。

代码非常简单:

Files.move(netDirJobs.toPath(), archiveJobs.toPath(),StandardCopyOption.ATOMIC_MOVE);

操作系统:Win7专业版SP1

@MarkJeronimus:

netDirLog.toPath().getFileSystem().provider()  = sun.nio.fs.WindowsFileSystemProvider@5dac9e07
archiveLog.toPath().getFileSystem().provider() = sun.nio.fs.WindowsFileSystemProvider@5dac9e07

同一对象

1
根据文档,“ATOMIC_MOVE”意味着其他事情:使用ATOMIC_MOVE,您可以将文件移动到目录中,并保证任何监视该目录的进程都可以访问完整的文件。 - Henry
2
现在,既然这将是文件系统方面的致命缺陷,你必须证明这确实发生了。个人认为你的问题在别处,因为一个会在这种情况下导致数据丢失的文件系统只是被破坏了。 - Kayaman
1
我需要一些调试帮助。这两个文件是否在同一个文件系统上?您能否在src和dst路径上执行path.getFileSystem().provider(),并检查结果是否为相同的对象?(使用==进行比较) - Mark Jeronimus
@MarkJeronimus 把你的答案编辑到了问题里。 - Sharku
1
我只能追溯到MSDN调用MoveFileEx,但我遇到了死路。 - Mark Jeronimus
1个回答

0

大家好,感谢你们的努力。

首先提供一些额外的信息: 我将数据移动了两次,首先是从源到临时目录,然后再移动到最终目标。

错误信息让我误以为这是Files.move()的问题。但实际上发生的是它正确地将文件移动到了临时目录,而这个目录当然会因为只是临时的而被删除。我去掉了临时目录的删除命令,现在如果从临时目录到目标的移动失败,它仍然会像我预期的那样保存在临时目录中。

对于这个不必要的问题,我很抱歉。

特别感谢Mark Jeronimus在过去4天里一直关注此事。


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