2016-06-09 28 views
2

我想刪除一個文件並用舊文件重命名另一個文件,但是我不能移動這個文件,因爲java拋出了java.nio.file.FileAlreadyExistsException以下是代碼段我使用Files.move和Files.copy引發java.nio.file.FileAlreadyExistsException

static void swapData(String origFilePath, String tempFilePath) throws IOException{ 

     Path tempPath = FileSystems.getDefault().getPath(tempFilePath); 
     Path origPath = FileSystems.getDefault().getPath(origFilePath); 
     try{ 
      String origFileName = null; 
      File origFileRef = new File(origFilePath); 
      if(Files.exists(origPath)){ 
       origFileName = origFileRef.getName(); 
       Files.delete(origPath); 
       if(Files.exists(origPath)) 
        throw new IOException("cannot able to delete original file"); 
      } 
      if(origFileName != null) 
       Files.move(tempPath, tempPath.resolveSibling(origFileName), StandardCopyOption.REPLACE_EXISTING); 
     }catch(IOException e){ 
      throw e; 
     } 
    } 

這裏是我的Files.move(tempPath, tempPath.resolveSibling(origFileName), StandardCopyOption.REPLACE_EXISTING);

recieving enter image description here 異常此外,當我看到在Windows資源管理器這個文件,它的縮略圖是存在的,但能不能打開它。我無法理解它爲什麼會發生,如果我正在使用REPLACE_EXISTING,爲什麼它會拋出FileAlreadyExistsException異常。

另外我編輯了上一個問題,因爲它沒有明確說明。

請幫助。

Anuj

+0

你能告訴你**到**和**目錄嗎? –

+1

當然,這不是一個簡單的本地文件系統權限問題? 順便說一句:我認爲你混淆了路徑? 'destPath'被存儲到'moveFrom'。也許只是一個品味問題,但目標應該是目標(「moveTo」)。 ;) **編輯**關於權限:您是否檢查過該文件是否已打開,並且您的用戶有權訪問該文件並寫入目標目錄? – DoNuT

+0

請參考新陳述的問題 – aga

回答

2

檢查,如果你有另一個線程持有相同的文件資源,同時運行Files.moveFiles.copy。我有相同的異常和文件訪問症狀,並能夠在序列化文件訪問後解決它。

此外,通過做Files.copyFiles.move當使用REPLACE_EXISTING選項,您不再需要編寫刪除原始文件,然後重命名TMP的多個步驟,雖然Files.moveFiles.copy不能保證原子。有一個ATOMIC_MOVE選項,但是我不喜歡執行特定的保證,如果文件已經存在,就可以拋出IOException,正如javadoc所描述的那樣。

ATOMIC_MOVE:移動是作爲原子文件系統操作執行的,所有其他選項都被忽略。如果目標文件存在,那麼它是特定於實現的,如果現有文件被替換,或者此方法通過拋出IOException失敗。如果移動不能作爲原子文件系統操作執行,則拋出AtomicMoveNotSupportedException。例如,如果目標位置位於不同的FileStore上,並且需要複製該文件,或者目標位置與此對象的其他提供程序相關聯,則會出現這種情況。

相關問題