-
Notifications
You must be signed in to change notification settings - Fork 26
/
DirUtils.java
152 lines (130 loc) · 4.33 KB
/
DirUtils.java
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
package bbejeck.nio.util;
import bbejeck.nio.files.directory.AsynchronousRecursiveDirectoryStream;
import bbejeck.nio.files.visitor.*;
import com.google.common.base.Function;
import com.google.common.base.Predicate;
import java.io.IOException;
import java.nio.file.*;
import java.util.EnumSet;
import java.util.Objects;
/**
* Created by IntelliJ IDEA.
* User: bbejeck
* Date: 1/22/12
* Time: 12:46 PM
*/
public class DirUtils {
private DirUtils() {
}
/**
* Walks file tree starting at the given path and deletes all files
* but leaves the directory structure intact.
*
* @param path Base path to start from
* @throws IOException
*/
public static void clean(Path path) throws IOException {
validate(path);
Files.walkFileTree(path, new CleanDirVisitor());
}
/**
* Walks file tree starting at the given path and deletes all files
* but leaves the directory structure intact. If the given Path does not exist nothing
* is done.
*
* @param path
* @throws IOException
*/
public static void cleanIfExists(Path path) throws IOException {
if (Files.exists(path)) {
validate(path);
Files.walkFileTree(path, new CleanDirVisitor());
}
}
/**
* Completely removes given file tree starting at and including the given path.
*
* @param path
* @throws IOException
*/
public static void delete(Path path) throws IOException {
validate(path);
Files.walkFileTree(path, new DeleteDirVisitor());
}
/**
* If the path exists, completely removes given file tree starting at and including the given path.
*
* @param path
* @throws IOException
*/
public static void deleteIfExists(Path path) throws IOException {
if (Files.exists(path)) {
validate(path);
Files.walkFileTree(path, new DeleteDirVisitor());
}
}
/**
* Copies a directory tree
*
* @param from
* @param to
* @throws IOException
*/
public static void copy(Path from, Path to) throws IOException {
validate(from);
Files.walkFileTree(from, EnumSet.of(FileVisitOption.FOLLOW_LINKS),Integer.MAX_VALUE,new CopyDirVisitor(from, to));
}
/**
* Moves one directory tree to another. Not a true move operation in that the
* directory tree is copied, then the original directory tree is deleted.
*
* @param from
* @param to
* @throws IOException
*/
public static void move(Path from, Path to) throws IOException {
validate(from);
Files.walkFileTree(from, new CopyDirVisitor(from, to));
Files.walkFileTree(from, new DeleteDirVisitor());
}
/**
* Traverses the directory structure and applies the given function to each file
* @param target
* @param function
* @throws IOException
*/
public static void apply(Path target, Function<Path,FileVisitResult> function) throws IOException{
validate(target);
Files.walkFileTree(target,new FunctionVisitor(function));
}
/**
* Traverses the directory structure and will only copy sub-tree structures where the provided predicate is true
* @param from
* @param to
* @param predicate
* @throws IOException
*/
public static void copyWithPredicate(Path from, Path to, Predicate<Path> predicate) throws IOException{
validate(from);
Files.walkFileTree(from, new CopyPredicateVisitor(from,to,predicate));
}
/**
* Returns a DirectoryStream that can iterate over files found recursively based on the pattern provided
* @param startPath the Directory to start from
* @param pattern the glob to match against files
* @return DirectoryStream
* @throws IOException
*/
public static DirectoryStream<Path> glob(Path startPath, String pattern) throws IOException{
validate(startPath);
return new AsynchronousRecursiveDirectoryStream(startPath,pattern);
}
private static void validate(Path... paths) {
for (Path path : paths) {
Objects.requireNonNull(path);
if (!Files.isDirectory(path)) {
throw new IllegalArgumentException(String.format("%s is not a directory", path.toString()));
}
}
}
}