Delete all empty folders in Java

12,291

Solution 1

This piece of code recursively delete all the empty folders or directory:

public class DeleteEmptyDir {
private static final String FOLDER_LOCATION = "E:\\TEST";
private static boolean isFinished = false;

public static void main(String[] args) {

    do {
        isFinished = true;
        replaceText(FOLDER_LOCATION);
    } while (!isFinished);
}

private static void replaceText(String fileLocation) {
    File folder = new File(fileLocation);
    File[] listofFiles = folder.listFiles();
    if (listofFiles.length == 0) {
        System.out.println("Folder Name :: " + folder.getAbsolutePath() + " is deleted.");
        folder.delete();
        isFinished = false;
    } else {
        for (int j = 0; j < listofFiles.length; j++) {
            File file = listofFiles[j];
            if (file.isDirectory()) {
                replaceText(file.getAbsolutePath());
            }
        }
    }
}
}

Solution 2

You can use code to delete empty folders using Java.

public static long deleteFolder(String dir) {

        File f = new File(dir);
        String listFiles[] = f.list();
        long totalSize = 0;
        for (String file : listFiles) {

            File folder = new File(dir + "/" + file);
            if (folder.isDirectory()) {
                totalSize += deleteFolder(folder.getAbsolutePath());
            } else {
                totalSize += folder.length();
            }
        }

        if (totalSize ==0) {
            f.delete();
        }

        return totalSize;
    }

Solution 3

Kotlin:

fun deleteAllEmptyDirectories(rootPath: Path): Collection<Path> =
    mutableListOf<Path>()
        .apply {
            Files.walk(testPath)
                .sorted { p1, p2 -> p2.count() - p1.count() }
                .map { it.toFile() }
                .filter { it.isDirectory }
                .forEach {
                    if (it.listFiles().all { el -> el.isDirectory && contains(el.toPath()) }) {
                        val path = it.toPath()
                        add(path)
                        Files.delete(path)
                    }
                }
        }

Test:

 private val testPath = Path.of("build", javaClass.simpleName, UUID.randomUUID().toString())

@Test
fun test() {
    Files.createDirectory(testPath)

    val dirWithTwoEmptySubdirs = Files.createDirectory(testPath.resolve("dirWithTwoEmptySubdirs"))
    val dir1 = Files.createDirectory(dirWithTwoEmptySubdirs.resolve("dir1"))
    val dir2 = Files.createDirectory(dirWithTwoEmptySubdirs.resolve("dir2"))
    val dirWithOneDiffDir = Files.createDirectory(testPath.resolve("dirWithOneDiffDir"))
    var emptyDir = Files.createDirectory(dirWithOneDiffDir.resolve("empty"))
    val notEmptyDir = Files.createDirectory(dirWithOneDiffDir.resolve("notempty"))
    Files.writeString(notEmptyDir.resolve("file.txt"), "asdf")

    assertEquals(
        setOf<Path>(dirWithTwoEmptySubdirs, dir1, dir2, emptyDir),
        deleteAllEmptyDirectories(testPath).toSet()
    )
}
Share:
12,291
TomTom
Author by

TomTom

Updated on June 06, 2022

Comments

  • TomTom
    TomTom almost 2 years

    I'd like to write a function that deletes all empty folders, with the option to ignore certain file types (allowed file types are stored in the hashmap) and tell if it should look inside directories.

    Calling:

    HashMap<String, Boolean> allowedFileTypes = new HashMap<String, Boolean>();
    allowedFileTypes.put("pdf", true);
    deleteEmptyFolders("ABSOLUTE PATH", allowedFileTypes, true);
    

    Function:

    public static void deleteEmptyFolders(String folderPath, HashMap<String, Boolean> allowedFileTypes, boolean followDirectory) {
    
        File targetFolder = new File(folderPath);
        File[] allFiles = targetFolder.listFiles();
    
    
        if (allFiles.length == 0)
            targetFolder.delete();
    
        else {
            boolean importantFiles = false;
    
            for (File file : allFiles) {
    
                String fileType = "folder";
                if (!file.isDirectory())
                    fileType = file.getName().substring(file.getName().lastIndexOf('.') + 1);
    
                if (!importantFiles)
                    importantFiles = (allowedFileTypes.get(fileType) != null);
    
                if (file.isDirectory() && followDirectory)
                    deleteEmptyFolders(file.getAbsolutePath(), allowedFileTypes, followDirectory);
            }
    
            // if there are no important files in the target folder
            if (!importantFiles)
                targetFolder.delete();
        }
    }
    

    The problem is that nothing is happening, even though it looks through all folders till the end. Is this a good approach or am I missing something completely?