import java.nio.file.Path;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.StandardCopyOption;
+import java.nio.file.StandardOpenOption;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Deque;
import java.util.LinkedList;
import java.util.Random;
+import java.util.function.Predicate;
import java.util.zip.DataFormatException;
import java.util.zip.Deflater;
import java.util.zip.Inflater;
return read;
}
- public static void delete(Path databaseLocation) throws IOException {
- Files.walkFileTree(databaseLocation, new DeleteDirectoriesVisitor());
+ public static void deleteWithFilter(Path path, Predicate<Path> filter) throws IOException {
+ if (Files.exists(path))
+ Files.walkFileTree(path, new DeleteDirectoriesVisitor(filter));
}
-
+
+ public static void delete(Path path) throws IOException {
+ deleteWithFilter(path, null);
+ }
+
public static void copy(Path from, Path to) throws IOException {
Files.walkFileTree(from, new CopyDirectoriesVisitor(from, to));
}
public static class DeleteDirectoriesVisitor extends SimpleFileVisitor<Path> {
-
+
+ private Predicate<Path> filter;
+
+ public DeleteDirectoriesVisitor(Predicate<Path> filter) {
+ this.filter = filter;
+ }
+
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
- Files.delete(file);
- if (Files.exists(file))
+ if (filter != null && !filter.test(file)) {
+ return FileVisitResult.CONTINUE;
+ }
+ if (Files.exists(file)) {
+ Files.delete(file);
+ }
+ if (Files.exists(file)) {
throw new IOException("Could not delete file " + file.toAbsolutePath().toString());
+ }
return FileVisitResult.CONTINUE;
}
public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
if (exc != null)
throw exc;
- Files.delete(dir);
+ if (filter != null && !filter.test(dir)) {
+ return FileVisitResult.CONTINUE;
+ }
+ if (Files.exists(dir)) {
+ Files.delete(dir);
+ }
if (Files.exists(dir))
throw new IOException("Could not delete file " + dir.toAbsolutePath().toString());
return FileVisitResult.CONTINUE;
raf.getFD().sync();
}
}
+
+ public static void sync(Path path) throws IOException {
+ try (InputStream stream = Files.newInputStream(path, StandardOpenOption.SYNC)) {
+ }
+ }
}