Java刪除文件或目錄及目錄下全部文件

  一直在作C++相關開發的工做。忽然某一天一時興起,想學習下Java開發。而後再網上找到一本Java簡明教程,入門是夠用了。看到文件IO這一章,想起以前用C++作的刪除文件或目錄的練習,因而打算用Java來實現這個功能。本覺得很簡單的功能,仍是遇到一些問題。仔細分析下代碼,定位到出問題的地方。在此處記錄下,提醒本身不會重蹈覆轍。函數

1. 初版的刪除函數是這樣寫的學習

 1 static boolean delFile(String filename) {
 2         File file = new File(filename);
 3         if (!file.exists()) {
 4             return false;
 5         }
 6 
 7         if (file.isFile()) {
 8             return file.delete();
 9         } else {
10             String[] filenames = file.list();
11             for (String f : filenames) {
12                 delFile(f);
13             }
14             return file.delete();
15         }
16     }

  代碼能編譯過,可是運行結果並不符合預期結果。若是在一個大型系統,出現這樣的問題,每每是一件很頭疼的小事。個人作法是,遇到本身不熟悉的,先本身建一個小工程實現這一功能,添加測試用例。若是測試經過,纔會移植到大系統上去。測試

  通過仔細分析,上面的代碼出問題的地方是第10行,file.list()返回的結果是當前路徑下的全部文件的文件名,並不包含路徑。因此遞歸調用時,由於檢測文件不存在,而返回。而後就有下面這一版。spa

2. 正確的刪除文件或目錄方法code

 1 static boolean delFile(File file) {
 2         if (!file.exists()) {
 3             return false;
 4         }
 5 
 6         if (file.isFile()) {
 7             return file.delete();
 8         } else {
 9             File[] files = file.listFiles();
10             for (File f : files) {
11                 delFile(f);
12             }
13             return file.delete();
14         }
15     }

  這版的代碼直接以文件對象File爲參數,file.listFiles()返回的也是自文件的File對象集合。File對象保存了該文件的具體位置,所以不會出現上一版出現的問題,這一版能正常的工做。對象

  代碼雖然能正常工做,但不是最簡潔的版本。下面有一個更爲簡潔的版本。blog

3. 簡單並能正常工做的版本教程

 1 static boolean delFile(File file) {
 2         if (!file.exists()) {
 3             return false;
 4         }
 5 
 6         if (file.isDirectory()) {
 7             File[] files = file.listFiles();
 8             for (File f : files) {
 9                 delFile(f);
10             }
11         }
12         return file.delete();
13     }

一樣能夠正常工做,可是代碼沒有重複的。遞歸

相關文章
相關標籤/搜索