File.renameTo()
看来Java 是有问题的,尤其是在Windows上。如API文档所述,
此方法的行为的许多方面本质上取决于平台:重命名操作可能无法将文件从一个文件系统移动到另一个文件系统,它可能不是原子的,并且如果目标抽象路径名的文件可能无法成功已经存在。应该始终检查返回值,以确保重命名操作成功。
就我而言,作为升级过程的一部分,我需要移动(重命名)可能包含千兆字节数据(很多子目录和大小不同的文件)的目录。移动始终在同一分区/驱动器中完成,因此实际上不需要物理移动磁盘上的所有文件。
这里不应该有任何文件锁定的目录中的内容被移动了,不过,很多时候,renameTo()无法完成其工作,并返回false。(我只是猜测也许某些文件锁在Windows上会任意地到期。)
当前,我有一个使用复制和删除的后备方法,但这很麻烦,因为它可能需要很多时间,具体取决于文件夹的大小。我也在考虑简单地记录一个事实,即用户可以手动移动文件夹,以免潜在地等待数小时。但是正确的方法显然是自动而快速的。
所以我的问题是,您是否知道一种可靠的替代方法,可以在Windows上使用Java(使用普通的JDK或某些外部库)进行快速移动/重命名。或者,如果您知道一种检测和释放给定文件夹及其所有内容(可能是成千上万个单独文件)的文件锁的简便方法,那也可以。
编辑:在这种情况下,似乎我们只是renameTo()
通过考虑更多的事情而放弃使用;看到这个答案。