2012-11-26 75 views
3

我試圖做一個簡單的方法,刪除一個文件的上層目錄,如果它們是空的,直到到達基本目錄,但我不能讓它工作。刪除文件及其父目錄,如果它們爲空。 (Java)

它刪除文件,它的父目錄,但是,它的下一個父項不會被刪除,因爲它會拋出一個DirectoryNotEmptyException。它真的是空的,因爲只有一個子目錄,並且它在之前的迭代中被刪除。

因此,文件被刪除,其父文件被刪除,並停止在那裏,沒有更多的上層目錄被刪除。

編輯:(修改後的代碼)

似乎有一個延遲刪除目錄,所以在目錄中的空虛狀態的查了下,前一個還沒有被刪除。所以我添加了一個while循環來檢查,直到目錄不存在。我不知道這是否是一種不好的技術,但它適用於我的需求。

public static void removeFileAndParentsIfEmpty(Path path) throws IOException { 
    if(path == null || path.endsWith(FilesPath.BILLS_DIRECTORY)) { 
     return; 
    } 
    if (Files.isRegularFile(path)){ 
     Files.deleteIfExists(path); 
    } else if (Files.isDirectory(path)){ 
     if(path.toFile().list().length == 0){ 
      Files.delete(path); 
      while(Files.exists(path)); 
     }else{ 
      return; 
     } 
    } else { 
     return; 
    } 
    removeFileAndParentsIfEmpty(path.getParent()); 
} 

如果有人能提供更好的解決方案,這個問題仍然是開放的批准。 謝謝。

+0

當拋出異常時,方法是否停止,我的意思是,如果Files.delete()拋出DirectoryNotEmptyException,它被捕獲並且方法結束而不做另一個遞歸調用,或者我錯了? – giorgiline

+0

哦,對不起,錯過了重新打電話,我的不好:P – MadProgrammer

回答

5

您沒有空目錄的基本條件,所以在第二次貫穿您的遞歸函數時,它會嘗試在目錄本身之前刪除空目錄parent。一個簡單的代碼更改應該足以解決這個問題:

public static void removeFileAndParentsIfEmpty(Path path) 
     throws IOException { 
    if(path == null || path.endsWith(BASEPATH)) return; 

    if (Files.isRegularFile(path)) { 
     Files.deleteIfExists(path); 
    } else if(Files.isDirectory(path)) { 
     try { 
      Files.delete(path); 
     } catch(DirectoryNotEmptyException e) { 
      return; 
     } 
    } 

    removeFileAndParentsIfEmpty(path.getParent()); 
} 
+0

它應該像那樣工作,但它沒有。看起來Files.delete()不會立即刪除目錄,並且在下次遞歸調用中再次調用該目錄時,以前的目錄仍然不會被刪除,這是可能的嗎? – giorgiline

+0

我不得不做一個有用的小竅門,但我認爲這不會很好用。 刪除目錄後,只需調用:'while(Files.exists(path));'將等到目錄不存在並繼續遞歸步行。 – giorgiline

1

我建議你的問題就出在這裏

Files.delete(path.getParent()); 
removeFileAndParentsIfEmpty(path.getParent()); 

刪除父文件夾時,再次撥打您的方法,試圖刪除同文件夾...看起來不再存在,第二個電話只是通過並沒有做任何事情而存在。

我也想添加一個檢查來查看目錄是否爲空,但是你是對的,異常會捕獲它,我只是將它看作是一種不好的做法,用於你正在尋找的條件 - 恕我直言

+0

我會研究一下。如果你說這不是一個好的做法,我相信你,謝謝你的建議。我只是想節省代碼。 – giorgiline

+1

恕我直言的例外是「意外」的情況,你正在預期這種情況,因此它不是「意外的」。 Java可能會在某些時候拋出許多異常,但在過去的幾年中一直使用基於C的系統,我更喜歡在錯誤級別和錯誤查找方面的異常:P – MadProgrammer

+0

我完全同意。 – giorgiline

相關問題