[英]Files.move and Files.copy is throwing java.nio.file.FileAlreadyExistsException
我想刪除一個文件並用舊文件重命名另一個文件,但我無法移動這個文件,因為 java 拋出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);
此外,當我在 Windows 資源管理器中看到此文件時,它的縮略圖存在但無法打開它。 我無法理解為什么會發生這種情況,如果我正在使用 REPLACE_EXISTING,為什么它會拋出 FileAlreadyExistsException 異常。
我也編輯了上一個問題,因為它沒有明確說明。
請幫忙。
阿努吉
檢查在運行Files.move
或Files.copy
時是否有另一個線程持有相同的文件資源。 我有相同的異常和文件訪問症狀,並且能夠在序列化文件訪問后解決它。
此外,通過在執行Files.copy
或Files.move
時使用REPLACE_EXISTING
選項,您不再需要編寫刪除原始文件然后重命名 tmp 的多個步驟,盡管Files.move
或Files.copy
不能保證是原子的。 有一個ATOMIC_MOVE
選項,但是我不喜歡實現特定的保證,如果文件已經如 javadoc 所描述的那樣存在,則可以拋出IOException
。
ATOMIC_MOVE :移動作為原子文件系統操作執行,所有其他選項都將被忽略。 如果目標文件存在,那么如果現有文件被替換或此方法因拋出 IOException 而失敗,則它是特定於實現的。 如果移動不能作為原子文件系統操作執行,則拋出 AtomicMoveNotSupportedException。 例如,當目標位置在不同的 FileStore 上並且需要復制文件時,或者目標位置與該對象的不同提供者相關聯時,就會出現這種情況。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.