3 回答
TA贡献1824条经验 获得超5个赞
另请参见Files.move()JDK 7中的方法。
一个例子:
String fileName = "MyFile.txt";
try {
Files.move(new File(fileName).toPath(), new File(fileName).toPath(), java.nio.file.StandardCopyOption.REPLACE_EXISTING);
} catch (IOException ex) {
Logger.getLogger(SomeClass.class.getName()).log(Level.SEVERE, null, ex);
}
TA贡献1818条经验 获得超3个赞
对于它的价值,还有一些其他概念:
在Windows上,
renameTo()
即使目标目录存在,即使它为空,似乎也会失败。就像我在Linux上尝试过的renameTo()
那样,只要目标为空,只要目标存在,它就会成功,这使我感到惊讶。(显然,我不应该假设这种事情在所有平台上都可以起作用;这正是Javadoc警告的。)
如果您怀疑可能存在一些挥之不去的文件锁,请稍等片刻再进行移动/重命名可能会有所帮助。(在安装程序/升级程序的某一点上,我们添加了一个“睡眠”操作和一个不确定的进度条,持续了大约10秒钟,因为某些文件可能挂着服务)。甚至可以执行一个简单的重试机制try
renameTo()
,然后等待一段时间(可能逐渐增加),直到操作成功或达到某个超时为止。
就我而言,大多数问题似乎都可以通过兼顾以上两者来解决,因此我们根本不需要进行本机内核调用或诸如此类的事情。
TA贡献1936条经验 获得超6个赞
就我而言,这似乎是我自己的应用程序中的死对象,该对象保留了该文件的句柄。因此,该解决方案对我有用:
for (int i = 0; i < 20; i++) {
if (sourceFile.renameTo(backupFile))
break;
System.gc();
Thread.yield();
}
优点:速度非常快,因为没有Thread.sleep()带有特定的硬编码时间。
缺点:20的限制是一些硬编码的数字。在我所有的测试中,i = 1就足够了。但可以肯定的是,我将其保留为20岁。
添加回答
举报