Java 的 File.renameTo()
似乎有问题,尤其是在 Windows 上。
正如 API 文档所说,
这种行为的许多方面 方法是固有的 与平台相关的: 重命名 操作可能无法移动 文件从一个文件系统传递到另一个文件系统, 也许不是原子弹,也许是 属性的文件不能成功 目的地抽象路径名 返回值应该总是 检查,以确保 重命名操作成功。
在我的例子中,作为升级过程的一部分,我需要移动(重命名)一个可能包含千兆字节数据的目录(许多子目录和大小不一的文件)。移动总是在同一个分区/驱动器内完成,所以实际上没有必要移动磁盘上的所有文件。
对于要移动的目录的内容,不应该有任何文件锁,但是仍然经常发生 renameTo ()无法完成其工作并返回 false。(我只是猜测,也许有些文件锁在 Windows 上会随意过期。)
目前我有一个回退方法,使用复制和删除,但这很糟糕,因为它可能需要 很多的时间,这取决于文件夹的大小。我还考虑简单地记录这样一个事实,即用户可以手动移动文件夹,以避免等待数小时。但是“正确的方式”显然是一种自动的、快速的方式。
所以我的问题是,你知道在 Windows 上用 Java 实现快速移动/重命名的另一种可靠方法吗,要么使用普通的 JDK,要么使用一些外部库。或者,如果您知道一种 放松方法来检测和释放给定文件夹和 里面所有的东西(可能有数千个单独的文件)的任何文件锁,那也是可以的。
编辑 : 在这个特殊的例子中,通过考虑更多的事情,我们似乎只使用了 renameTo()
; 参见 这个答案。