簡體   English   中英

Files.move 和 Files.copy 正在拋出 java.nio.file.FileAlreadyExistsException

[英]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.moveFiles.copy時是否有另一個線程持有相同的文件資源。 我有相同的異常和文件訪問症狀,並且能夠在序列化文件訪問后解決它。

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM