我有以下Java代碼,它遍歷目錄中的所有文件並刪除它們。Java File.delete()不會刪除所有文件
for(File file : tmpDir.listFiles())
{
file.delete();
}
但它不會刪除所有文件。一些人,通常20-30,幾千人,當我這樣做時,被留下。是否有可能解決這個問題,還是我偶然發現了一些最好的單獨的Java巫術?
我有以下Java代碼,它遍歷目錄中的所有文件並刪除它們。Java File.delete()不會刪除所有文件
for(File file : tmpDir.listFiles())
{
file.delete();
}
但它不會刪除所有文件。一些人,通常20-30,幾千人,當我這樣做時,被留下。是否有可能解決這個問題,還是我偶然發現了一些最好的單獨的Java巫術?
強制垃圾回收器運行使用System.gc();
使所有文件都可以刪除。
這是一個解決方案,但這樣做「沒問題」嗎? – Mafro34
我有這個問題,直到我發現我忘記關閉的文件。像往常一樣,如果我發現我必須收集垃圾才能獲得所需的行爲,那麼我就有資源泄漏。 –
但是調用System.gc();不保證垃圾收集暫時發生。 –
它返回一個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);
}
例。
我不明白爲什麼人們喜歡這個。它不回答OP的問題,它更適合評論。 –
大概在那裏得到了一半 – clwhisk
我試過了,但它永遠不會返回false,所以在刪除文件時沒有「錯誤」。當循環迭代並刪除它們時,好像文件沒有被看到。 – user1049697
請確保您沒有像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();
}
也許你沒有刪除該文件的權限。或者它被鎖定,或者被重新創建或其他東西。檢查返回值以確定刪除是否成功)。還要考慮目錄必須是空的才能被刪除。 –
有什麼錯誤?哪些文件沒有被刪除? – WhileTrueSleep
您確定可以手動刪除所有文件嗎?可能有些被其他程序使用。嘗試捕獲異常:_「請注意,Files類定義了在文件無法刪除時拋出IOException的delete方法,這對於錯誤報告和診斷爲什麼無法刪除文件很有用。」_ –