Java 如果目标存在,如何使用Apache commons io递归移动目录?

Java 如果目标存在,如何使用Apache commons io递归移动目录?,java,apache-commons-io,Java,Apache Commons Io,我一直在尝试让以下简单代码正常工作,但我不明白为什么会失败: File dir = new File("/foo/bar"); // A path to a directory File destDir = new File("/blah"); // The destination dir FileUtils.moveDirectoryToDirectory(dir, destDir, !destDir.exists()); dir目录包含文件和目录。destDir可能包含,也可能不包含ba

我一直在尝试让以下简单代码正常工作,但我不明白为什么会失败:

File dir = new File("/foo/bar"); // A path to a directory
File destDir = new File("/blah"); // The destination dir

FileUtils.moveDirectoryToDirectory(dir, destDir, !destDir.exists());
dir
目录包含文件和目录。
destDir
可能包含,也可能不包含
bar

我得到的错误是:

Caused by: org.apache.commons.io.FileExistsException: Destination '/blah/bar' already exists
我做错了什么?
内置的
文件.move(…)
会做得更好吗(我使用的是JDK1.8)?我也试过了,但似乎没能成功。这是一个简单的东西,我不明白为什么要花这么多精力来实现…

尝试
copyDirectoryToDirectory()
,然后删除原始源…

尝试
copyDirectoryToDirectory()
然后删除原始源…

“为什么失败”怎么会失败?你是说你想合并这两个目录吗?@MauricePerry,是的!我该怎么做呢?我想在<代码> > BLAH/Bar < /代码>下移动<代码> BAR/<代码>,如果它存在,那么所有的内容都应该被覆盖和任何目录合并。我也愿意考虑一种不需要Apache CAMONS IO的方法,如果它更有效的话。“为什么它失败了”。怎么会失败?你是说你想合并这两个目录吗?@MauricePerry,是的!我该怎么做呢?我想在<代码> > BLAH/Bar < /代码>下移动<代码> BAR/<代码>,如果它存在,那么所有的内容都应该被覆盖和任何目录合并。我也愿意考虑一种不需要Apache CAMONS IO的方法,如果它更高效的话。复制文件,然后删除它们是不太有效的。例如,如果您有一个SSD,这将在某一点上对硬件产生影响,更不用说您需要两倍的可用空间才能在删除其中一个副本之前拥有两个完整副本。@carlspring我建议的是一种解决方法,
moveDirectoryToDirectory()
基本上是做同样的事情,但一次只处理一个子目录,它处理源子目录的完整内容并递归删除每个源子目录。复制文件然后删除它们不是很有效。例如,如果您有一个SSD,这将在某一点上对硬件产生影响,更不用说您需要两倍的可用空间才能在删除其中一个副本之前拥有两个完整副本。@carlspring我建议的是一种解决方法,
moveDirectoryToDirectory()
基本上是做同样的事情,但每次只处理一个子目录,它处理源子目录的完整内容并递归删除每个源子目录。