亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Windows上可靠的File.renameTo()替代方法?

Windows上可靠的File.renameTo()替代方法?

慕田峪4524236 2019-09-21 11:43:19
File.renameTo()似乎Java 是有問題的,尤其是在Windows上。如API文檔所述,此方法的行為的許多方面本質上與平臺有關:重命名操作可能無法將文件從一個文件系統移動到另一個文件系統,它可能不是原子的,并且如果具有目標抽象路徑名的文件可能無法成功已經存在。應該始終檢查返回值,以確保重命名操作成功。就我而言,作為升級過程的一部分,我需要移動(重命名)可能包含千兆字節數據(很多子目錄和大小不同的文件)的目錄。移動始終在同一分區/驅動器中完成,因此并不需要物理上移動磁盤上的所有文件。這里不應該有任何文件鎖定的目錄中的內容被移動了,不過,很多時候,renameTo()無法完成其工作,并返回false。(我只是猜測也許某些文件鎖在Windows上會任意地到期。)當前,我有一個使用復制和刪除的后備方法,但是這種方法很麻煩,因為它可能要花費很多時間,具體取決于文件夾的大小。我也在考慮簡單地記錄一個事實,即用戶可以手動移動文件夾,以免潛在地等待數小時。但是正確的方法顯然是自動而快速的。所以我的問題是,您是否知道另一種可靠的方法,可以在Windows上使用Java(使用普通的JDK或某些外部庫)進行快速移動/重命名?;蛘撸绻酪环N檢測和釋放給定文件夾及其所有內容(可能是成千上萬個單獨文件)的任何文件鎖的簡便方法,那也可以。
查看完整描述

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);

}


查看完整回答
反對 回復 2019-09-21
?
泛舟湖上清波郎朗

TA貢獻1818條經驗 獲得超3個贊

對于它的價值,還有一些其他概念:

  1. 在Windows上,renameTo()即使目標目錄存在,即使它為空,似乎也會失敗。就像我在Linux上嘗試過的renameTo()那樣,只要目標為空,只要目標存在,它就會成功,這使我感到驚訝。

    (顯然,我不應該假設這種事情在所有平臺上都可以起作用;這正是Javadoc警告的。)

  2. 如果您懷疑可能存在一些揮之不去的文件鎖,請稍等片刻再進行移動/重命名可能會有所幫助。(在安裝程序/升級程序的某一點上,我們添加了一個“睡眠”操作和一個不確定的進度條,持續了大約10秒鐘,因為某些文件可能掛著服務)。甚至可以執行一個簡單的重試機制try renameTo(),然后等待一段時間(可能逐漸增加),直到操作成功或達到某個超時為止。

就我而言,大多數問題似乎都可以通過兼顧以上兩者來解決,因此我們根本不需要進行本機內核調用或諸如此類的事情。


查看完整回答
反對 回復 2019-09-21
?
LEATH

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歲。


查看完整回答
反對 回復 2019-09-21
  • 3 回答
  • 0 關注
  • 1081 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號