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條經驗 獲得超7個贊
就我而言,這似乎是我自己的應用程序中的死對象,該對象保留了該文件的句柄。因此,該解決方案對我有用:
for (int i = 0; i < 20; i++) {
if (sourceFile.renameTo(backupFile))
break;
System.gc();
Thread.yield();
}
優點:速度非???,因為沒有Thread.sleep()帶有特定的硬編碼時間。
缺點:20的限制是一些硬編碼的數字。在我所有的測試中,i = 1就足夠了。但可以肯定的是,我將其保留為20歲。
添加回答
舉報
