java系列之 复制原始目录文件到新的 目录文件【Windows 和 Linux 均可使用】

我 | 在这里
✈️公众号 | 热爱技术的小郑 。文章底部有个人公众号二维码。回复 Java全套视频教程前端全套视频教程 即可获取 300G+ 教程资料及项目实战案例
🚀 邮箱 | 2977429967@qq.com

前言

  将一个目录下的文件 复制一份到新的 文件目录。如果原始文件带有权限。

案例Demo

import java.io.IOException;
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;

public class CopyMoveDirectoryWithPermissions {
    public static void main(String[] args) {
        Path sourceDirectory = Paths.get("path/to/source/directory");
        Path destinationDirectory = Paths.get("path/to/destination/directory");

        try {
            // 删除目标目录下的所有内容
            deleteDirectory(destinationDirectory);

            // 复制整个目录
            copyDirectory(sourceDirectory, destinationDirectory);

            // 或者移动整个目录
            // moveDirectory(sourceDirectory, destinationDirectory);

            System.out.println("Directory copied/moved successfully.");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private static void deleteDirectory(Path directory) throws IOException {
        if (Files.exists(directory)) {
            Files.walkFileTree(directory, new SimpleFileVisitor<Path>() {
                @Override
                public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
                    Files.delete(file);
                    return FileVisitResult.CONTINUE;
                }

                @Override
                public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
                    Files.delete(dir);
                    return FileVisitResult.CONTINUE;
                }
            });
        }
    }

    private static void copyDirectory(Path source, Path destination) throws IOException {
        Files.walkFileTree(source, new SimpleFileVisitor<Path>() {
            @Override
            public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
                Path targetDir = destination.resolve(source.relativize(dir));
                Files.copy(dir, targetDir, StandardCopyOption.REPLACE_EXISTING, StandardCopyOption.COPY_ATTRIBUTES);
                return FileVisitResult.CONTINUE;
            }

            @Override
            public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
                Path targetFile = destination.resolve(source.relativize(file));
                Files.copy(file, targetFile, StandardCopyOption.REPLACE_EXISTING, StandardCopyOption.COPY_ATTRIBUTES);
                return FileVisitResult.CONTINUE;
            }
        });
    }

    private static void moveDirectory(Path source, Path destination) throws IOException {
        Files.move(source, destination, StandardCopyOption.REPLACE_EXISTING);
    }
}

注意点

第一点
  目标目录不能是两次以上不存在的目录、创建不成功。不存在的一层目录、可以创建成功

第二点

java.nio.file.DirectoryNotEmptyException: E:\data\myimage

  这个异常通常是因为在尝试移动目录时,目标目录非空而抛出的。在你的情况中,可能是目标目录 E:\data\myimage 非空,而你在尝试移动源目录到这个位置。如果你想要覆盖目标目录,你可以使用递归删除目标目录下的所有内容,然后再移动源目录。【案例Demo就是先删除 后复制移动】