Java的File.renameTo()
在Windows系统下存在问题。
正如API文档所述,该方法的许多行为与平台有关。重命名操作可能无法将文件从一个文件系统移动到另一个文件系统,它可能不是原子性的,并且如果目标抽象路径名已经存在,则可能无法成功。应始终检查返回值以确保重命名操作成功。
在我的情况下,作为升级过程的一部分,我需要移动(重命名)一个可能包含吉比特数据的目录(具有不同大小的许多子目录和文件)。移动通常在同一分区/驱动器内完成,因此实际上没有必要物理移动磁盘上的所有文件。
希望被移动的目录中不会有任何文件锁定,但是很常见的情况是,renameTo()无法完成其工作并返回false。(我猜测在Windows上某些文件锁似乎会在任意时刻过期。)
目前我有一种备选方法,即使用复制和删除,但这种方法很慢,具体时间取决于文件夹的大小。我还考虑简单地记录用户手动移动文件夹的事实,以避免等待数小时。但是,正确的方法显然应该是自动且快速的。
因此,我的问题是,您是否知道在Windows上使用Java进行快速移动/重命名的可靠替代方法,无论是使用纯JDK还是某个外部库。或者,如果您知道检测和释放给定文件夹及其所有内容(可能包括数千个单独的文件)的任何文件锁的易于方法,这也可以。
编辑:在这种特定情况下,我们似乎通过考虑更多的因素,仅使用renameTo()
就顺利完成了操作;请参见此答案。