package fr.pandacube.lib.util; import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.attribute.BasicFileAttributes; /** * Provides utility methods to manipulate files and directories */ public class FileUtils { /** * Recursively delete the provided file and all of its content if it is a directory. * @param target the target file or directory. */ public static void delete(File target) { if (target.isDirectory()) for (File child : target.listFiles()) delete(child); target.delete(); } /** * Recursively copy the provided source file or directory to the provided target. * @param source the source file or directory. * @param target the copy destination. * @throws IOException if an IO error occurs. * @throws IllegalStateException if target file already exists and one of source or target is not a directory. * @throws IllegalArgumentException if at least one of the parameter is null, or if the source doesn't exist. */ public static void copy(File source, File target) throws IOException { if (source == null || !source.exists()) { throw new IllegalArgumentException("source is null or doesn't exist: " + source); } if (target == null) { throw new IllegalArgumentException("target cannot be null"); } if (target.exists() && !(target.isDirectory() && source.isDirectory())) { throw new IllegalStateException("target file already exists and one of source or target is not a directory: " + target); } BasicFileAttributes sourceAttr = Files.readAttributes(source.toPath(), BasicFileAttributes.class); if (sourceAttr.isDirectory()) { if (!target.exists()) target.mkdirs(); for (String child : source.list()) { copy(new File(source, child), new File(target, child)); } } else if (sourceAttr.isRegularFile()) { Files.copy(source.toPath(), target.toPath()); } } }