ATOMIC_MOVE会抛出异常。

9

我正在自动化一系列我们经常进行的操作,以节省时间。这包括移动文件和启动一些批处理。

在该特定情况下,我正在尝试将文件从一个位置复制到另一个位置。一切都很顺利,直到我尝试使用ATOMIC_MOVE复制选项。这是我的代码:

private void copyToDropFolder(Datafile datafile, String company) throws IOException{
    Path datafilePath = datafile.getDataPath();  
    String dropFolder = locations.getLocationFor("default");
    Path dropPath = Paths.get(dropFolder, company.toUpperCase(),locations.getLocationFor("drop"), datafile.getFileName());
    Files.copy(datafilePath, dropPath, StandardCopyOption.ATOMIC_MOVE);
}

我已经检查并解决了datafilePath和dropPath的位置,它们都是有效的。我已经尝试过其他两个标准复制选项,程序运行良好。只有在使用ATOMIC_MOVE时,我才会遇到UnsupportedOperationException。虽然我并不一定需要这个具体的选项,但我很好奇为什么它不能工作。我无法找到其他关于此问题的报告。我在Windows 7机器上进行此操作。
我是否漏掉了什么?或者ATOMIC_MOVE确实不被支持?

为什么你尝试使用ATOMIC_MOVE来进行复制操作?这没有意义。或者你想使用link()吗? - fge
你在尝试哪种文件系统类型?可能是该操作不受支持。(http://docs.oracle.com/javase/tutorial/essential/io/move.html) - Dominik Sandjaja
@fge 你说得对... 从那个角度来看的确没有意义。但是在名为StandardCopyOption的枚举中有一个ATOMIC_MOVE选项也不太合理 :/。你指出了这个问题,我之前没有考虑到。目前为止,我并不想使用它,只是尝试了一下发现它失败了。我很困惑为什么会失败。 - anothernoc
@DaDaDom 我正在使用Windows 7机器进行操作,所以我会选择NTFS。 - anothernoc
1
它失败是因为你无法以原子方式复制,但只要源路径和目标路径在同一个文件系统上,就可以以原子方式链接。看看 Files.createLink(),这可能是你想要的。 - fge
2个回答

25

正如API所说ATOMIC_MOVE不支持copy(),仅支持move()


谢谢!我错过了那个。我完全专注于这个:http://docs.oracle.com/javase/7/docs/api/java/nio/file/StandardCopyOption.html - anothernoc

5
ATOMIC_MOVE是用于移动操作的,而不是复制操作。
另一方面,您可以使用Files.createLink()创建所谓的“硬链接”。还有createSymbolicLink(),但这可能不是您在这里想要的。
当然,.createLink()仅在源路径和目标路径位于同一文件系统上时才有效。

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