package org.argeo.util; import java.io.IOException; import java.nio.file.FileVisitResult; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.SimpleFileVisitor; import java.nio.file.attribute.BasicFileAttributes; /** Utilities around the standard Java file abstractions. */ public class FsUtils { /** * Deletes this path, recursively if needed. Does nothing if the path does not * exist. */ public static void copyDirectory(Path source, Path target) { if (!Files.exists(source) || !Files.isDirectory(source)) throw new IllegalArgumentException(source + " is not a directory"); if (Files.exists(target) && !Files.isDirectory(target)) throw new IllegalArgumentException(target + " is not a directory"); try { Files.createDirectories(target); Files.walkFileTree(source, new SimpleFileVisitor() { @Override public FileVisitResult postVisitDirectory(Path directory, IOException e) throws IOException { if (e != null) throw e; Path relativePath = source.relativize(directory); Path targetDirectory = target.resolve(relativePath); Files.createDirectory(targetDirectory); return FileVisitResult.CONTINUE; } @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { Path relativePath = source.relativize(file); Path targetFile = target.resolve(relativePath); Files.copy(file, targetFile); return FileVisitResult.CONTINUE; } }); } catch (IOException e) { throw new RuntimeException("Cannot copy " + source + " to " + target, e); } } /** * Deletes this path, recursively if needed. Does nothing if the path does not * exist. */ public static void delete(Path path) { try { if (!Files.exists(path)) return; Files.walkFileTree(path, new SimpleFileVisitor() { @Override public FileVisitResult postVisitDirectory(Path directory, IOException e) throws IOException { if (e != null) throw e; Files.delete(directory); return FileVisitResult.CONTINUE; } @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { Files.delete(file); return FileVisitResult.CONTINUE; } }); } catch (IOException e) { throw new RuntimeException("Cannot delete " + path, e); } } /** Singleton. */ private FsUtils() { } }