1. 程式人生 > >Java刪除文件或目錄及目錄下所有文件

Java刪除文件或目錄及目錄下所有文件

路徑 但是 開發 clas dir 簡明教程 相關 簡潔 遞歸調用

一直在做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()返回的結果是當前路徑下的所有文件的文件名,並不包含路徑。所以遞歸調用時,因為檢測文件不存在,而返回。然後就有下面這一版。

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

 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對象保存了該文件的具體位置,因此不會出現上一版出現的問題,這一版能正常的工作。

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

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     }

同樣可以正常工作,但是代碼沒有重復的。

Java刪除文件或目錄及目錄下所有文件