Fix FileUtils.copy not accepting regular file as source. Also made it handle directory merging.

This commit is contained in:
Marc Baloup 2023-06-25 13:17:46 +02:00
parent 7c4fd78680
commit 7481b12111

View File

@ -27,28 +27,26 @@ public class FileUtils {
* @param source the source file or directory. * @param source the source file or directory.
* @param target the copy destination. * @param target the copy destination.
* @throws IOException if an IO error occurs. * @throws IOException if an IO error occurs.
* @throws IllegalStateException if the target destination already exists and is not a directory. * @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. * @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 { public static void copy(File source, File target) throws IOException {
if (source == null || !source.exists() || !source.isDirectory()) { if (source == null || !source.exists()) {
throw new IllegalArgumentException("source is null or doesn't exist: " + source); throw new IllegalArgumentException("source is null or doesn't exist: " + source);
} }
if (target == null) { if (target == null) {
throw new IllegalArgumentException("target cannot be null"); throw new IllegalArgumentException("target cannot be null");
} }
if (target.exists() && !target.isDirectory()) { if (target.exists() && !(target.isDirectory() && source.isDirectory())) {
throw new IllegalStateException("target file already exists but is not a directory: " + target); 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); BasicFileAttributes sourceAttr = Files.readAttributes(source.toPath(), BasicFileAttributes.class);
if (sourceAttr.isDirectory()) { if (sourceAttr.isDirectory()) {
if (target.mkdir()) { if (!target.exists())
for (String child : source.list()) target.mkdirs();
for (String child : source.list()) {
copy(new File(source, child), new File(target, child)); copy(new File(source, child), new File(target, child));
} }
else {
throw new IOException("Cannot create directory " + target);
}
} }
else if (sourceAttr.isRegularFile()) { else if (sourceAttr.isRegularFile()) {
Files.copy(source.toPath(), target.toPath()); Files.copy(source.toPath(), target.toPath());