2013-11-02 64 views
3

我有以下Java代碼,它遍歷目錄中的所有文件並刪除它們。Java File.delete()不會刪除所有文件

for(File file : tmpDir.listFiles()) 
{ 
    file.delete(); 
} 

但它不會刪除所有文件。一些人,通常20-30,幾千人,當我這樣做時,被留下。是否有可能解決這個問題,還是我偶然發現了一些最好的單獨的Java巫術?

+2

也許你沒有刪除該文件的權限。或者它被鎖定,或者被重新創建或其他東西。檢查返回值以確定刪除是否成功)。還要考慮目錄必須是空的才能被刪除。 –

+0

有什麼錯誤?哪些文件沒有被刪除? – WhileTrueSleep

+1

您確定可以手動刪除所有文件嗎?可能有些被其他程序使用。嘗試捕獲異常:_「請注意,Files類定義了在文件無法刪除時拋出IOException的delete方法,這對於錯誤報告和診斷爲什麼無法刪除文件很有用。」_ –

回答

3

強制垃圾回收器運行使用System.gc();使所有文件都可以刪除。

+1

這是一個解決方案,但這樣做「沒問題」嗎? – Mafro34

+1

我有這個問題,直到我發現我忘記關閉的文件。像往常一樣,如果我發現我必須收集垃圾才能獲得所需的行爲,那麼我就有資源泄漏。 –

+0

但是調用System.gc();不保證垃圾收集暫時發生。 –

10

它返回一個boolean值,你應該檢查。從JavaDoc

返回: 真當且僅當文件或目錄被成功刪除;否則爲假

您應該檢查退貨的價值並採取措施。

如果它返回false它很可能是您沒有刪除該文件的權限。

在這種情況下,您可以檢查該文件是否可由應用程序寫入,並且如果不嘗試使其可寫 - 同樣返回boolean。如果成功,您可以嘗試再次刪除。

你可以使用一個實用方法:

private void deleteFile(final File f) throws IOException { 
    if (f.delete()) { 
     return; 
    } 
    if (!f.canWrite() && !f.setWritable(true)) { 
     throw new IOException("No write permissions on file '" + f + "' and cannot set writeable."); 
    } 
    if (!f.delete()) { 
     throw new IOException("Failed to delete file '" + f + "' even after setting writeable; file may be locked."); 
    } 
} 

我也將採取在JavaDoc他們的建議:

注意的是,文件類定義的刪除方法拋出一個 IOException異常時,文件不能被刪除。這對報告錯誤 以及診斷文件無法刪除的原因很有用。

假設您使用的是Java 7。該方法拋出一個數字,你可以處理的異常:從Oracle tutorial page採取

try { 
    Files.delete(path); 
} catch (NoSuchFileException x) { 
    System.err.format("%s: no such" + " file or directory%n", path); 
} catch (DirectoryNotEmptyException x) { 
    System.err.format("%s not empty%n", path); 
} catch (IOException x) { 
    // File permission problems are caught here. 
    System.err.println(x); 
} 

例。

+1

我不明白爲什麼人們喜歡這個。它不回答OP的問題,它更適合評論。 –

+0

大概在那裏得到了一半 – clwhisk

+1

我試過了,但它永遠不會返回false,所以在刪除文件時沒有「錯誤」。當循環迭代並刪除它們時,好像文件沒有被看到。 – user1049697

0

請確保您沒有像BufferedReader/Writer,FileReader/Writer等任何開放流。首先關閉它們,然後您應該可以刪除該文件。另外一點,例如,如果您通過另一個閱讀器(如FileReader)打開BufferedReader,則必須分別關閉兩個閱讀器。

因此,不是這樣的:

BufferedReader reader = new BufferedReader(new FileReader(new File(filePath));); 

做到這一點:

BufferedReader bufferedReader = null; 
FileReader fileReader = null; 

try{ 
    fileReader = new FileReader(readFile); 
    bufferedReader = new BufferedReader(fileReader); 

}catch{...} 

... 

try { 
    fileReader.close(); 
    bufferedReader .close(); 
    readFile.delete(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 
相關問題