簡體   English   中英

如何在不刪除父文件夾的情況下遞歸刪除空目錄?

[英]How to delete empty directories recursively without deleting parent folder?

以下 function 用於刪除備份文件夾內的空目錄。 但是這種方法的問題是如果它是空的,它也會刪除備份文件夾。

public static void deleteEmptyDirectoriesOfFolder(final File folder) {
    if(folder.listFiles().length == 0){
        folder.delete();
    }else {
        for (final File fileEntry : folder.listFiles()) {
            if (fileEntry.isDirectory()) {
                deleteEmptyDirectoriesOfFolder(fileEntry);
                if(fileEntry.listFiles().length == 0){
                    fileEntry.delete();
                }
            }
        }
    }

}

假設我的文件夾結構如下,

backup
 -2019
  -10
   -15
 -2020

如果我將方法稱為deleteEmptyDirectoriesOfFolder(backup)它也會刪除backup文件夾。 有什么建議可以在不包含方法的第二個參數的情況下修復它?

File周圍有一個包裝器 class 如下

class FileWrapper {
   private File folder;
   private boolean isRoot;
}

當您第一次調用deleteEmptyDirectoriesOfFolder時,將FileWrapper初始化為

File folder = new File("<backup_dir_path>");
FileWrapper fileWrapper = new FileWrapper(folder, true);
deleteEmptyDirectoriesOfFolder(fileWrapper);

然后將deleteEmptyDirectoriesOfFolder方法稍微更改為

public static void deleteEmptyDirectoriesOfFolder(final FileWrapper fileWrapper) {
    if(fileWrapper.getFolder().listFiles().length == 0 && !fileWrapper.getIsRoot()){
        fileWrapper.getFolder().delete();
    }else {
        for (final File fileEntry : fileWrapper.getFolder().listFiles()) {
            if (fileEntry.isDirectory()) {
                FileWrapper fileWrapper = new FileWrapper(fileEntry, false);
                deleteEmptyDirectoriesOfFolder(fileWrapper);
                if(fileEntry.listFiles().length == 0){
                    fileEntry.delete();
                }
            }
        }
    }

}

你這么近,只需用兩種方法打破它:

  • deleteEmptySubDirectoriesOfFolder - 為所有子目錄調用當前方法
  • deleteEmptyDirectoriesOfFolder - 您當前的方法。

這是新方法:

public static void 
deleteEmptySubDirectoriesOfFolder(final File folder) 
{
    for (final File fileEntry : folder.listFiles()) {
            if (fileEntry.isDirectory()) {
                deleteEmptyDirectoriesOfFolder(fileEntry);
                if(fileEntry.listFiles().length == 0){
                    fileEntry.delete();
                }
            }
        }

}

實際上......我很驚訝你從來沒有得到NullPointerException 我覺得你應該。 根據您提供的目錄結構示例,我將樹解釋為:

- backup
    - 2019
        - 10   
            - 15
    - 2020

deleteEmptyDirectoriesOfFolder()方法中的for循環遍歷文件夾時,它會對由fileEntry.isDirectory()確定的任何子目錄進行遞歸調用。 遞歸調用最終到達名為15的子目錄,在這種情況下進行最終遞歸調用。 在最后一次遞歸調用for循環上方的if語句的條件

if (folder.listFiles().length == 0) {
    folder.delete();
}

變為,最終子目錄被刪除,遞歸調用返回到之前的遞歸調用,除了現在,因為文件夾(15)被刪除fileEntry.listFiles()變為 null 因此再次檢查fileEntry.listFiles()時(在遞歸調用下的for循環中):

deleteEmptyDirectoriesOfFolder(fileEntry);
if (fileEntry.listFiles().length == 0) { // HERE
    fileEntry.delete();
}

應該拋出NullPointerException 您想忽略 null 的那些,因此,您應該在嘗試播放之前檢查fileEntry.listFiles()是否為 null,如下所示:

public static void deleteEmptyDirectoriesOfFolder(final File folder) {
    if (folder.listFiles().length == 0) {
        folder.delete();
    }
    else {
        for (final File fileEntry : folder.listFiles()) {
            if (fileEntry.isDirectory()) {
                deleteEmptyDirectoriesOfFolder(fileEntry);
                if (fileEntry.listFiles() != null && fileEntry.listFiles().length == 0) {
                    fileEntry.delete();
                }
            }
        }
    }
}

如果您不想刪除空的備份文件夾,則只需使用for循環(應保留備份目錄):

public static void deleteEmptyDirectoriesOfFolder(final File folder) {
    for (final File fileEntry : folder.listFiles()) {
        if (fileEntry.isDirectory()) {
            deleteEmptyDirectoriesOfFolder(fileEntry);
            if (fileEntry.listFiles() != null && fileEntry.listFiles().length == 0) {
                fileEntry.delete();
            }
        }
    }
}

您的方法現在應該正確地使用 function。

這是我經過其他答案后的解決方案,

public static void deleteEmptyDirectoriesOfFolder(final File folder) {
    deleteEmptyDirectoriesOfFolder(folder, true);
}

private static void deleteEmptyDirectoriesOfFolder(final File folder, boolean isRoot) {
    if(!isRoot && folder.listFiles().length == 0){
        folder.delete();
    }else {
        for (final File fileEntry : folder.listFiles()) {
            if (fileEntry.isDirectory()) {
                File parent = fileEntry.getParentFile();
                deleteEmptyDirectoriesOfFolder(fileEntry,false);
                if(!isRoot && parent != null && parent.listFiles().length == 0){
                    parent.delete();
                }
            }
        }
    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM