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
84
85
86
87
88
89
90
91
92
93
94
95
96
package Torello.Java;

import static Torello.Java.C.*;

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

class MoveFiles 
{
    // Internal Method.  Skips Retesting Input Validity, during recursion.
    static int MOVE(
            final FileNode          directory,
            final FileNodeFilter    filter, 
            final String            targetDirectory,
            final Appendable        a
        )
        throws IOException
    {
        int                 count   = 0;
        Iterator<FileNode>  iter    =  directory.getDirContentsFiles(RTC.ITERATOR());

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

            CopyFiles.COPY(fn.getFullPathName(), targetDirectory + fn.name);

            if (a != null) a.append(
                BCYAN + "COPY: " + RESET + fn.getFullPathName() + BCYAN + "\tTO:\t" + RESET + 
                targetDirectory + fn.name + '\n'
            );

            fn.getJavaIOFile().delete();

            if (a != null) a.append(BCYAN + "DELETE: " + RESET + fn.getFullPathName() + '\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 String            targetDirectory,
            final Appendable        a
        )
        throws IOException
    {
        int numMoved = MoveFiles.MOVE(directory, fileFilter, targetDirectory, a); 

        if (a != null) a.append(
            "Moved " + StrPrint.zeroPad(numMoved) + " files from:" +
            BRED + " [" + directory.getFullPathName() + "]" + RESET +
            " to: " + BRED + "[" + targetDirectory + "]" + 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;

            final String newTargetDirectory = targetDirectory + dir.name + File.separator;
            new File(newTargetDirectory).mkdirs();

            numMoved += MoveFiles.RECURSIVE(dir, fileFilter, dirFilter, newTargetDirectory, 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 numMoved;
    }
}