1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
package Torello.Java;

import static Torello.Java.C.*;

import java.util.*;
import java.io.*;
import java.nio.file.*;

class DeleteFiles 
{
    // Internal Method.  Skips Retesting Input Validity, during recursion.
    static int DELETE(
            final FileNode          directory,
            final FileNodeFilter    filter,
            final Appendable        a
        )
        throws IOException
    {
        int count = 0;

        final Iterator<FileNode> iter = directory.getDirContentsFiles(RTC.ITERATOR());

        while (iter.hasNext())
        {
            final FileNode fn = iter.next();
            if ((filter != null) && (! filter.test(fn))) continue;

            final File f = fn.getJavaIOFile();
            f.delete();

            if (a != null) a.append("DELETED: " + BCYAN + fn.getFullPathName() + RESET + '\n');
            count++;
        }

        return count;  
    }

    // Internal Method.  Skips Retesting Input Validity, during recursion.
    static int RECURSIVE(
            final FileNode          directory,
            final FileNodeFilter    fileFilter,
            final FileNodeFilter    dirFilter,
            final Appendable        a
        )
        throws IOException
    {
        int numDeleted = DeleteFiles.DELETE(directory, fileFilter, a);

        if (a != null) a.append(
            "Deleted (" + StrPrint.zeroPad(numDeleted) + ") files from:" +
            BRED + " [" + directory.getFullPathName() + "]" + RESET + '\n'
        );

        final Iterator<FileNode> dirs = directory.getDirContentsDirs(RTC.ITERATOR());

        while (dirs.hasNext())
        {
            final FileNode dir = dirs.next();
            if ((dirFilter != null) && (! dirFilter.test(dir))) continue;

            numDeleted += DeleteFiles.RECURSIVE(dir, fileFilter, dirFilter, a);
        }

        final File      d               = directory.getJavaIOFile();
        final boolean   shouldDelete    = (dirFilter == null) || dirFilter.test(directory);

        int numRemainingFiles = d.list().length;

        if ((numRemainingFiles == 0) && shouldDelete)
        {
            d.delete();
            if (a != null) a.append
                ("Deleted (Empty) Directory: " + directory.getFullPathName() + '\n');
        }

        else if ((a != null) && (numRemainingFiles > 0) && shouldDelete) a.append(
            "Unable to delete NON-EMPTY Directory: " + directory.getFullPathName() + ", " + 
            numRemainingFiles + " file(s) or dir(s) still remain.\n"
       );

        return numDeleted;
    }
}