使用java制作Windows复制指定文件夹所有内容到另一个目录脚本

前言
说明:把指定文件夹下的指定文件类型复制到另一个指定的目录,不管目录有多深,会递归把这个目录下所有符合类型的文件复制到指定的目录。(指定的目录会自动创建)

执行命令
# 执行命令参数说明
# 参数1:要把文件复制出来的目录
# 参数2:要把文件复制到哪个目录
# 参数3:要复制的文件夹类型
java -cp . Copy 参数1 参数2 参数3


命令行手动执行

编译:javac -encoding GBK Copy.java

运行:java -cp . Copy   D:\Download   E:\ruanjian 2023,2024

这个运行就是命令就是把D盘 Download目录中包含2023和2024 文件夹所有内容复制到桌面的 E盘\ruanjian 目录下(ruanjian 目录如果不存在则会自动创建)

windows 批处理执行

1、新建 copy.bat

2、写入以下内容

:: windows 批处理
start cmd /k  "javac -encoding GBK Copy.java  && java -cp . Copy   D:\Download   E:\ruanjian  2021,2022"

直接上代码,有其他需求可以后面自定义修改:

/**
 * 复制文件到某个位置
 */
public class Copy {

    // 源文件目录
    private static String sourcePath = "D:\Download";
    // 要把文件复制到哪个目录
    private static String downloadPath = "E:\ruanjian";
    // 文件夹类型
    private static String fileType = "2023,2024";

    public static void main(String[] args) {
        // 参数校验
        // 传递两个路径进来
        if (args != null && args.length >= 2) {
            sourcePath = args[0];
            System.out.println("参数传递-源文件目录:" + args[0]);
            downloadPath = args[1];
            System.out.println("参数传递-把文件复制到这个目录下:" + args[1]);
            if (args.length >= 3) {
                fileType = args[2];
                System.out.println("参数传递-要复制的文件夹年份:" + args[2]);
            }
        }

        File sourceFile = new File(sourcePath);
        if (!sourceFile.exists() || !sourceFile.isDirectory()) {
            System.err.println("源文件目录不存在或不是目录。");
            System.exit(1);
        }

        try {
            long l = System.currentTimeMillis();
            //获取所有包含指定名称的文件夹集合
            List<String> matchingFiles = new ArrayList<>();
            for (String year : fileType.split(",")) {
                matchingFiles.addAll(searchFiles(sourceFile.getPath(), year));
            }
            // 复制该文件夹下所有的文件
            for (String file : matchingFiles) {
                bulkCopyFile(new File(file), downloadPath);
            }
            long time = System.currentTimeMillis() - l;
            System.out.println("耗时:" + time + " 秒:" + time / 1000);
        } catch (IOException e) {
            System.out.println("复制文件出现异常,原因:" + e.getMessage());
            e.printStackTrace();
            System.exit(1);
        }
    }

    /**
     * 获取所有包含指定名称的文件夹集合
     *
     * @param directory 源文件目录
     * @param fileName  指定的文件名
     * @return 包含指定文件名的文件夹列表
     * @throws IllegalArgumentException 如果目录或文件名为空
     * @throws IOException              如果发生IO异常
     */
    private static List<String> searchFiles(String directory, String fileName) throws IllegalArgumentException, IOException {
        // 参数校验
        if (directory == null || directory.isEmpty() || fileName == null || fileName.isEmpty()) {
            throw new IllegalArgumentException("目录和文件名不能为空或空");
        }

        List<String> result = new ArrayList<>();
        Stack<File> stack = new Stack<>();
        stack.push(new File(directory));

        while (!stack.isEmpty()) {
            File current = stack.pop();
            File[] files = current.listFiles();

            if (files != null) {
                for (File file : files) {
                    if (file.getName().equals(fileName)) {
                        result.add(file.getAbsolutePath());
                    } else if (file.isDirectory()) {
                        stack.push(file);
                    }
                }
            }
        }
        return result;
    }


    /**
     * 批量复制文件
     *
     * @param fs     要复制的目录
     * @param target 目标位置
     * @throws IOException
     */
    public static void bulkCopyFile(File fs, String target) throws IOException {
        // 输入验证
        if (fs == null || target == null || target.trim().isEmpty()) {
            throw new IllegalArgumentException("源文件或目标路径不可为null或空");
        }

        target = ensureEndsWith(target, File.separator);

        if (fs.isDirectory()) {
            File[] files = fs.listFiles();
            for (File file : files) {
                bulkCopyFile(file, target);
            }
            return;
        }
        // 复制文件

        // 普通复制
        //copy(fs, target);

        // 快速复制
        quickCopy(fs, target);
    }

    private static String ensureEndsWith(String str, String suffix) {
        if (str == null) {
            return null;
        }
        if (!str.endsWith(suffix)) {
            return str + suffix;
        }
        return str;
    }

    /**
     * 快速复制文件
     *
     * @param src    源文件
     * @param target 目标路径
     */
    public static void quickCopy(File src, String target) {
        FileChannel outputChannel = null;
        FileChannel inputChannel = null;
        FileInputStream fis = null;
        FileOutputStream fos = null;
        try {
            //System.out.println(src.getName() + " 进入快速复制程序...");

            File targetPath = new File(target);
            // 判断文件是否存在
            if (!targetPath.exists()) {
                targetPath.mkdirs();
            }
            String[] split = sourcePath.split("\\\\");
            String fileName = src.getPath().substring(src.getPath().lastIndexOf(split[split.length - 1]) + split[split.length - 1].length(), src.getPath().indexOf(src.getName()));
            File file = new File(target + fileName);
            // 判断文件是否存在
            if (!file.exists()) {
                file.mkdirs();
            }
            File targetFile = new File(targetPath + File.separator + fileName + src.getName());


            System.out.println("源文件位置:" + src.getAbsolutePath());
            System.out.println("目标文件位置:" + targetFile.getAbsolutePath());

            fis = new FileInputStream(src);
            fos = new FileOutputStream(targetFile);

            // 获取源文件通道
            inputChannel = fis.getChannel();
            // 获取目标文件通道
            outputChannel = fos.getChannel();

            // 将源文件数据通过通道传输到目标文件
            inputChannel.transferTo(0, inputChannel.size(), outputChannel);

            System.out.println(src.getName() + " 快速复制成功!");
        } catch (IOException e) {
            System.out.println(src.getName() + " 快速复制失败,原因:" + e.getMessage());
        } finally {
            // 关闭资源
            try {
                if (outputChannel != null) {
                    outputChannel.close();
                }
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
            try {
                if (inputChannel != null) {
                    inputChannel.close();
                }
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
            try {
                if (fos != null) {
                    fos.close();
                }
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
            try {
                if (fis != null) {
                    fis.close();
                }
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    }

    /**
     * 复制文件
     *
     * @param src    源文件
     * @param target 目标路径
     */
    public static void copy(File src, String target) {
        try {
            System.out.println(src.getName() + " 进入复制程序...");

            File targetPath = new File(target);
            // 判断文件是否存在
            if (!targetPath.exists()) {
                targetPath.mkdirs();
            }

            File targetFile = new File(targetPath + File.separator + src.getName());
            System.out.println("源文件位置:" + src.getAbsolutePath());
            System.out.println("目标文件位置:" + targetFile.getAbsolutePath());

            FileInputStream fis = new FileInputStream(src);
            FileOutputStream fos = new FileOutputStream(targetFile);

            byte[] buffer = new byte[1024];
            int n;
            while ((n = fis.read(buffer)) != -1) {
                fos.write(buffer, 0, n);
            }

            // 关闭资源
            fos.close();
            fis.close();

            System.out.println(src.getName() + " 复制成功!");
        } catch (IOException e) {
            System.out.println(src.getName() + " 复制失败,原因:" + e.getMessage());
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值