2013-07-03 39 views
6

我正在自动执行一系列的操作,我们为了获得一些时间而做了很多操作。这包括移动文件并开始一些批次。Java 7 ATOMIC_MOVE给出例外

在这种特殊情况下,我试图将文件从一个位置复制到另一个位置。所有工作正常,直到我尝试使用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的位置,它们都是有效的。我已经尝试了其他2个标准复制选项,并且程序运行良好。只有ATOMIC_MOVE才会得到UnsupportedOperationException。并不是我绝对需要这个具体的选择,但我很好奇为什么我不会工作。我无法找到关于这个问题的任何其他报告。我在Windows 7机器上这样做。

我错过了什么吗?或者ATOMIC_MOVE只是不被支持?

+0

你为什么试着'ATOMIC_MOVE'做一个_copy_操作?这根本不符合逻辑。或者你想使用'link()'? – fge

+0

你正在尝试使用哪种文件系统类型?这可能是该操作不受支持(http://docs.oracle.com/javase/tutorial/sesential/io/move.html) –

+0

@fge你是对的......当你以这种方式看待它时,它没有任何意义。但是在一个名为StandardCopyOption的枚举中有一个ATOMIC_MOVE选项也没什么意义:/你指出很好,我没有这样想。至于现在,我真的不想用它,我只是试了一下,它失败了。我很困惑,为什么它会失败。 – anothernoc

回答

14

由于API says,ATOMIC_MOVE不支持copy(),但只支持move()

+0

谢谢!我错过了那一个。我完全专注于[this](http://docs.oracle.com/javase/7/docs/api/java/nio/file/StandardCopyOption.html) – anothernoc

2

ATOMIC_MOVE用于移动操作,而不是复制操作。

另一方面,您可以使用Files.createLink()创建所谓的“硬链接”。也有createSymbolicLink(),但这可能不是你想要的。

当然,.createLink()只有当源路径和目标路径位于同一个文件系统上时才有效。