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 CopyFiles 
{
    //Internal Method.  Skips Retesting Input Validity, during recursion.
    static int COPY(
            final FileNode          directory,
            final FileNodeFilter    filter,
            final String            targetDirectory,
            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;

            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'
            );

            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 numCopied = CopyFiles.COPY(directory, fileFilter, targetDirectory, a);

        if (a != null) a.append(
            "Copied " + StrPrint.zeroPad(numCopied) + " 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();
            numCopied += CopyFiles.RECURSIVE(dir, fileFilter, dirFilter, newTargetDirectory, a);
        }

        return numCopied;
    }

    static void COPY(
            final String inFileName,
            final String outFileOrDirName
        )
        throws IOException
    {
        try (
            FileInputStream     fis = new FileInputStream(inFileName);
            FileOutputStream    fos = new FileOutputStream(outFileOrDirName);            
        )
        {
            final byte[] b = new byte[5000];

            int result = 0;
            while ((result = fis.read(b)) != -1) fos.write(b, 0, result);

            fos.flush();
        }
    }
}