从键盘接收两个文件夹路径,把其中一个文件夹中的内容拷贝到另一个文件夹中

本文介绍了一个简单的文件夹复制程序,程序通过递归方式复制文件夹及其内容。首先从用户输入获取源文件夹和目标文件夹路径,确保路径有效后,使用递归方法逐个复制文件夹内的文件和子文件夹。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前话:在下面的程序段中,将IOException进行抛出,未做处理


正式内容:

    /**
     *程序段入口 
     */
    public static void task_1() throws IOException{
        
        System.out.println("input path 1:");
        //源文件对象,需要复制的文件
        File file1 = getPath();

        System.out.println("input path 2:");
        //目的文件对象,复制到指定文件夹的对象
        File file2 = getPath();

        copyFile(file1,file2);
    }


    /*
    * 从键盘录入文件夹路径,并判断属否为合法路径,返回一个File对象
    * 
    * */
    public static File getPath() throws IOException{
        BufferedReader bufr =
                new BufferedReader(new InputStreamReader(System.in));
        String line = null;
        File file = null;
        
        while ((line=bufr.readLine()) != null){
             file = new File(line);
             //判断路径是否合法
            if (file.exists()){
                break;
            }else {
                System.out.println("wrong path, input again:");
            }
        }
        return file;
    }

    /*
    * 主要功能程序段
    * 整体思路仍然是使用递归
    * */
    public static void copyFile(File file1, File file2) throws IOException{
        
        FileInputStream fis = null;
        FileOutputStream fos = null;
        
        //利用for循环遍历当前文件夹中每一个File对象
        File[] files = file1.listFiles();
        for (File f : files){
            if (f.isDirectory()){
                //如果是文件夹,需要现在file2中创建一个名称相同的文件夹,
                // 然后再递归到该文件夹里面,复制相应的文件
                //对于创建的文件夹名称,需要获取到file2绝对路径,然后加上f的名称
                File file = new File(file2.getAbsolutePath()+"\\"+f.getName());
                file.mkdir();
                //此处就需要进入新建的文件夹内部进行递归
                //这样才能复制该文件夹内的文件
                copyFile(f,file);
            }else {
                //如果是文件,就是用常规方法进行文件的复制
                //在输出file2的文件名称 需要先获取到f的文件名称 然后加上file2的绝对路径
                //这样就能创建一个名称相同的文件(注意此处需要加上 "\\")
                //之后再不断地复制内容
                fis = new FileInputStream(f);
                fos = new FileOutputStream(file2.getAbsolutePath()+"\\"+ f.getName());
                byte[] buf = new byte[1024];
                int len = 0;
                while ((len=fis.read(buf)) != -1){
                    fos.write(buf, 0, len);
                }
                fis.close();
                fos.close();
            }
        }
    }


<think>好的,用户想了解如何在Linux自动化编译脚本中实现文件夹拷贝。我需要详细说明步骤,并确保使用正确的命令和格式。 首先,应该确定用户是否熟悉基本的Linux命令。不过问题中提到的是自动化编译脚本,所以可能用户有一定的脚本编经验。我需要介绍cp命令的基本用法,包括递归复制和覆盖选项,因为这些在自动化场景中很重要。 接下来,可能需要考虑权限问题,是否需要使用sudo。不过自动化脚本中使用sudo可能会涉及密码输入的问题,所以需要提醒用户注意权限设置,或者建议在脚本中提前处理权限。 然后,应该给出一个具体的脚本示例,比如使用cp -r命令,并解释每个参数的作用。同时,提醒用户注意路径的正确性,绝对路径和相对路径的区别,以及目标文件夹是否存在的情况。 外,可能需要提到其他方法,比如rsync,特别是当需要增量同步或保留更多文件属性时。不过对于简单的拷贝任务,cp可能已经足够,但rsync在某些情况下更高效,尤其是在处理大文件夹或需要网络传输时。 还要注意错误处理,比如检查源文件夹是否存在,目标是否可,以及是否在拷贝失败时进行适当的处理。这些在自动化脚本中很重要,可以增强脚本的健壮性。 最后,总结关键点,确保用户能够根据需求选择合适的命令,并正确应用到他们的编译脚本中。需要保持回答结构清晰,分步骤说明,并给出示例,这样用户更容易理解和应用。</think>在 Linux 自动化编译脚本中实现文件夹拷贝,可以通过以下步骤完成(使用 `cp` 命令为核心): **1. 基础命令格式** ```bash cp -r <源文件夹路径> <目标文件夹路径> ``` - `-r` 参数:递归复制(必须用于目录拷贝) - 若目标文件夹已存在:会将源文件夹复制到目标文件夹内部 - 若目标文件夹不存在:会创建目标文件夹并复制内容 **2. 典型应用场景示例** ```bash #!/bin/bash # 示例1:拷贝到同级目录(目标文件夹不存在) cp -r ./src ./src_backup # 示例2:拷贝到父级目录(覆盖已存在内容) cp -rf ../old_project/assets ./build/ # 示例3:使用绝对路径 cp -r /home/user/configs /mnt/backup/ ``` **3. 关键参数说明** | 参数 | 作用 | |------|-----------------------------| | `-r` | 递归复制(必须用于文件夹) | | `-f` | 强制覆盖已有文件(无提示) | | `-v` | 显示详细操作过程(调试时推荐) | | `-p` | 保留文件属性(时间戳、权限等) | **4. 注意事项** - 权限问题:若目标目录需要管理员权限,需使用 `sudo cp -r ...` - 路径规范: - 使用绝对路径 `/path/to/dir` 更可靠 - 相对路径需注意执行脚本时的当前目录 - 特殊符号:路径含空格时要用引号包裹 `cp -r "source dir" "dest dir"` **5. 增强版方案(使用 rsync)** 当需要增量同步或网络传输时更高效: ```bash rsync -avh --progress /source/folder/ /destination/folder/ ``` - `-a`:归档模式(保留所有属性) - `-v`:显示详细信息 - `-h`:友好单位显示 - 末尾斜杠 `/` 的区别:带斜杠拷贝目录内容,不带斜杠拷贝目录本身 **6. 完整脚本示例** ```bash #!/bin/bash # 定义路径 SRC_DIR="./build" DEST_DIR="/var/www/html" # 检查源目录是否存在 if [ ! -d "$SRC_DIR" ]; then echo "错误:源目录 $SRC_DIR 不存在" exit 1 fi # 执行拷贝(带错误检测) if cp -rvf "$SRC_DIR" "$DEST_DIR"; then echo "成功拷贝 $SRC_DIR 到 $DEST_DIR" else echo "拷贝操作失败!" exit 1 fi ``` 根据实际需求选择方案: - 简单拷贝:使用 `cp -r` - 需要保留属性/增量同步:使用 `rsync` - 需要错误处理:添加条件判断和退出码检测
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值