2010-03-03 61 views
2

我有java代碼下面的代碼片斷:爲什麼一個文件重命名失敗在Java

File directoryToMoveTo = new File(file.getParent()+"_TEMP"); 
boolean success = file.renameTo(new File(directoryToMoveTo,file.getName())); 
if (!success){ 
    logger.warn("Failed to move [%s] to temp Directory."); 
} 

文件傳遞作爲參數的方法,是這樣獲得的文件的陣列中的一個:

File[] files = directory.listFiles(new FilenameFilter() { 
    @Override 
    public boolean accept(File dir, String name) { 
     logger.debug(String.format("Testing file [%s]",name)); 
     boolean passed = name.endsWith(getFileDescription().getFilePattern()); 
     logger.debug(String.format("Passed [%s]",passed)); 
     return passed; 
    } 
}); 

爲什麼在第一個片段中通過false會成功?

我試着在不同的文件上隔離這個代碼,它似乎工作。

回答

5

明顯的情況:

  • 目標文件已經存在
  • 目標目錄不存在
  • 目標目錄是不同的文件系統
  • 目標目錄是隻讀(或至少,當前用戶沒有寫入權限)

我想期望那些至少可能失敗的人(JavaDoc明確表示這種行爲很多取決於操作系統) - 你試過了嗎?

+0

您可以編輯自己的帖子沒有得到一個「編輯」標誌? – Stroboskop 2010-03-03 15:17:34

+0

約翰Skeet可以做任何事情:)感謝喬恩,確實是這個問題...我添加了一個檢查存在的目錄和一個mkdir,如果它不存在。 – 2010-03-03 15:24:00

+0

@Stroboskop:您可以對答案的前幾分鐘進行編輯。 – 2010-03-03 15:33:47

0

不要忘記你可能不允許寫入/更改/重命名文件。
在Windows中幾乎不存在問題,但在Unix環境中很常見。

1

原創不存在? 目標路徑上已有文件? Destinatination路徑不存在? 源文件只讀嗎?

只是一些想法

1

我能想到的:

  • 目標目錄不存在
  • 沒有足夠的訪問權限(目標目錄寫保護)目標
  • 沒有足夠的可用空間目錄的數據分區
  • ...
0

要找到它無法正常工作的確切原因,您可以使用System.out.println這些路徑,並嘗試從操作系統級別移動它們。那會給人一個很好的指示,爲什麼它不起作用。

2

我發現了這個問題。這是因爲我正在複製的目錄不存在。

這一週圍if語句的工作:

if (directoryToMoveTo.exists() || directoryToMoveTo.mkdir()){ }