You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Java中将多目录下的子目录及文件移动至同一目录

Java实现多目录子文件夹批量迁移到指定目标目录

实现思路

  1. 定义需要扫描的源目录列表和目标目录路径
  2. 遍历每个源目录,筛选出其中的子目录(排除文件)
  3. 检查目标目录是否存在,不存在则自动创建
  4. 将子目录移动到目标目录下,处理可能的冲突(如目标已存在则覆盖或跳过)

完整实现代码

import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;

public class DirectoryMover {
    public static void main(String[] args) {
        // 配置:多个源目录路径
        List<String> sourceDirPaths = Arrays.asList(
                "D:/source/folder1",
                "D:/source/folder2",
                "D:/source/folder3"
        );
        // 配置:目标目录(比如AU、US、UK这类自定义目录)
        String targetDirPath = "D:/target/AU";

        Path targetDir = Paths.get(targetDirPath);
        try {
            // 创建目标目录(包括父目录),如果已存在则不做操作
            Files.createDirectories(targetDir);

            // 遍历每个源目录
            for (String sourceDirPath : sourceDirPaths) {
                Path sourceDir = Paths.get(sourceDirPath);
                // 检查源目录是否存在
                if (!Files.exists(sourceDir) || !Files.isDirectory(sourceDir)) {
                    System.err.println("源目录不存在或不是目录:" + sourceDirPath);
                    continue;
                }

                // 遍历源目录下的所有子项
                try (var stream = Files.list(sourceDir)) {
                    stream.filter(Files::isDirectory) // 只处理子目录
                          .forEach(subDir -> {
                              // 目标路径:目标目录 + 子目录名称
                              Path targetSubDir = targetDir.resolve(subDir.getFileName());
                              try {
                                  // 移动目录,若目标已存在则替换
                                  Files.move(subDir, targetSubDir, StandardCopyOption.REPLACE_EXISTING);
                                  System.out.println("成功移动目录:" + subDir + " -> " + targetSubDir);
                              } catch (IOException e) {
                                  System.err.println("移动目录失败:" + subDir);
                                  e.printStackTrace();
                              }
                          });
                }
            }
            System.out.println("所有目录迁移完成");
        } catch (IOException e) {
            System.err.println("初始化目标目录失败");
            e.printStackTrace();
        }
    }
}

代码关键说明

  • 目录创建:Files.createDirectories(targetDir) 会自动创建目标目录的所有父级目录,避免因父目录不存在导致的错误
  • 目录筛选:stream.filter(Files::isDirectory) 确保只处理子目录,不会误移动文件
  • 移动逻辑:Files.move 方法支持原子移动(同文件系统下),跨文件系统时会自动转为「复制+删除」操作;StandardCopyOption.REPLACE_EXISTING 参数指定如果目标目录已存在则覆盖
  • 异常处理:针对源目录不存在、移动失败等场景做了错误提示,便于排查问题

注意事项

  1. 权限问题:确保程序对源目录有读取权限,对目标目录有写入权限
  2. 跨文件系统移动:如果源目录和目标目录在不同磁盘分区(如C盘到D盘),Files.move 会复制后删除原目录,此时需要注意磁盘空间是否充足
  3. 冲突处理:如果不需要覆盖已存在的目标目录,可以移除StandardCopyOption.REPLACE_EXISTING参数,此时若目标已存在会抛出异常,你可以根据需求改为跳过或提示用户

内容的提问来源于stack exchange,提问作者srinivas seenu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 09:45:47