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