2014-04-01 52 views
2

我已經習慣了Java 7和新的Files類。Java中的臨時文件對Files.copy的AccessDeniedException NIO2

我正在寫一個小應用程序,它在某些時候必須替換文件的內容。 我使用了一個臨時文件,以避免在某些錯誤出現時擦除目標文件。但是,在執行實際複製時,我總是得到AccessDeniedException

這裏是我的代碼:

// Temporary file generation. 
Path target = getCurrentConfigFile(); // Returns a path, works ok. 
Path tempFile = Files.createTempFile("tempfile", null); 
Files.write(tempFile, conf.getBytes(Charset.defaultCharset()), StandardOpenOption.WRITE); 

// Actual copy. 
Files.copy(tempFile, target, StandardCopyOption.REPLACE_EXISTING); 

// Cleanup. 
Files.delete(tempFile); 

getCurrentConfigFile()處理目標文件路徑創建:

(... generates various strings from configuration parameters) 
return FileSystems.getDefault().getPath(all, these, various, strings); 

當我執行的代碼,它是通過.bat腳本,我得到兩個與錯誤一個標準的命令提示符或標高。 目標文件位於C:\temp\tests,這是我用同一​​個Windows用戶創建的一個目錄。

看來問題在於從臨時文件讀取,因爲直接寫入目標文件。 我應該在哪裏看下?

+0

作爲一個測試,你可以寫目標,而不是臨時? getCurrentConfigFile是做什麼的?也許它打開文件而不關閉它? – assylias

+0

@assylias我編輯了我的問題,添加了關於'getCurrentConfigFile()'的細節。我不認爲它與此問題有關。直接寫入目標作品。也許我的try塊太寬了,問題在於讀取臨時文件。 –

回答

1

不是一個答案,但太長的評論。我運行下面(從Windows 7中的命令行)的代碼,它按預期工作:

public static void main(String[] args) throws IOException { 
    Path target = Paths.get("C:/temp/test.txt"); // Returns a path, works ok. 
    Path tempFile = Files.createTempFile("tempfile", null); 
    Files.write(tempFile, "abc".getBytes(UTF_8), StandardOpenOption.WRITE); 

    // Actual copy. 
    Files.copy(tempFile, target, StandardCopyOption.REPLACE_EXISTING); 

    // Cleanup. 
    Files.delete(tempFile); 
} 

所以你的問題不在於該代碼。它可能在您的代碼中的其他位置,或者由於您使用的文件/文件夾的權限。

+0

謝謝你的努力。這不是一個好消息,因爲代碼問題,我可以修復,剩下的,我不確定!我會盡量通過使用我自己的臨時目錄來繞過這個問題。 –

+1

經過一些代碼拼寫之後,我發現一個'BufferedReader'沒有在該文件上正確關閉,在之前調用的其他類中。我會接受你的「長評論」作爲我的問題的答案:「你的代碼很好,在其他地方搜索。」 –