[英]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();
}
}
}
}
}
你這么近,只需用兩種方法打破它:
這是新方法:
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.