2013-03-08 103 views
7

我有一些代碼旨在打開本地主文件,進行添加,並通過覆蓋主文件並覆蓋可訪問的網絡位置上的寫保護副本來保存文件。這是通過將修改的文件保存到臨時文件,然後複製其他兩個文件來完成的。Java Files.copy完全替換現有刪除文件

String tempFileName= "File.tmp"; 
String fileName= "File.xlsm"; 
String serverPath="\\\\network path\\"; 
File serverFile = new File(serverPath+fileName); 

Files.copy(Paths.get(tempFileName),Paths.get(fileName), 
    StandardCopyOption.COPY_ATTRIBUTES,StandardCopyOption.REPLACE_EXISTING); 

if(serverFile.exists()){serverFile.setWritable(true, false);} 

Files.copy(Paths.get(tempFileName),Paths.get(serverPath+fileName), 
    StandardCopyOption.COPY_ATTRIBUTES,StandardCopyOption.REPLACE_EXISTING); 

serverFile.setWritable(false,false); 

Files.delete(Paths.get(tempFileName)); 

此代碼工作得很好大部分的時間但是,一些代碼成功完成,沒有例外,但與刪除的網絡位置文件的時間。本地主文件被正確保存和更新,但網絡上應存在的文件已經不存在了。

是什麼讓這更加困難是我無法在任何受控環境下重現此問題。所以我想請教你如何從文件複製/覆蓋操作發生這種指導。

謝謝

UPDATE:

我有預感,並檢查網絡訪問日誌服務器文件路徑。當且僅當該文件被創建者以外的用戶訪問,但並非全部訪問時,纔會刪除該文件。同樣,這是作爲只讀訪問的,所以打開文件的用戶不應該影響覆蓋新版本,大部分時間不會影響。深入挖掘它看起來偶爾當且僅當該文件被另一個用戶打開並且java試圖覆蓋該文件時拋出一個AccessDenied異常並且文件被刪除。

我相信這肯定是setWritable()或Files.copy(或組合)中的一個錯誤,因爲在任何情況下文件都不應該被刪除,而isWritable()每次都會返回true。我嘗試了其他方法來設置/ UN設置只讀權限,並已空出來。目前的工作就是捕獲異常並循環,直到文件被刪除,並且新的副本到位。這有效,但真的是黑客,所以如果任何人有更好的解決方案/建議,我歡迎他們。

+0

你的文件有多大?在複製文件時,可能是由網絡斷開引起的? – Byron 2013-03-08 20:09:06

+0

@Byron這是我唯一的工作理論,但我已經長時間運行網絡連接測試,沒有丟失 – David 2013-03-11 20:35:46

+0

@Byron此文件將最終大,但目前只有〜500k – David 2013-03-14 23:55:47

回答

-2

How does FileLock work?,你可以這樣做:

  1. 等待文件變得可用
  2. 鎖定文件
  3. 覆蓋/刪除/其他
  4. 解鎖(如適用)

這應該防止其他用戶在修改文件的過程中進行訪問。

+1

當且僅當其他用戶也使用文件鎖定。 – EJP 2014-12-01 09:58:03

+0

我想這取決於文件系統的實現,但在我的本地測試中,如果我鎖定了一個文件,缺少以編程方式手動刪除鎖定,我無法在鎖定打開時刪除,寫入或重命名該文件。所以不知道爲什麼我在這裏被低估了! – Fallso 2015-01-08 15:24:46