Linux下目录递归拷贝的单进程实现

1.实验目的

  1. 掌握Linux应用程序命令行参数传递方法
  2. 掌握POSIX API中文件I/O操作方法,包括:打开文件、关闭文件、创建文件、读写文件、确定和改变文件当前位置

2.实验内容

利用POSIX API在Linux系统上编写应用程序,仿写cp命令的部分功能,将源文件/目录复制到另外一个文件或复制到另外一个目录。源文件路径和目标文件路径通过命令行参数来指定

  1. 将test1.text复制成test2.txt:

test@linux test$ ./mycp /home/test1.txt /usr/test2.txt

  1. 将test1.txt复制到/tmp目录中:

test@linux test$ ./mycp /home/test1.txt /tmp(目录)

  1. 将目录递归拷贝到另外一个目录中:

test@linux test$ ./mycp /home/test(目录) /tmp(目录)

在实现基本功能实现的基础上,针对各种特殊情况和边界条件等进行流程的完善与优化,包括:

a) 目标文件存在时给出"是否覆盖","是否合并"等提示信息,用户可以选择覆盖目标文件或者将已经存在的目标文件和源文件实现合并(在目标文件的尾部实现追加写入)

b) 源文件不存在时给出错误提示信息

d) 源文件是目录时给出错误提示信息

3.核心代码分析

确保有两个额外的传递参数:argc0(程序名),argc1,argc2

cpp 复制代码
  if (argc < 3)
  {
    fprintf(stderr, "Usage: %s <source> <destination>\n", argv[0]);
    return 1;
  }

将argv1也就是源文件中的文件信息,写入到src_stat结构体中。

cpp 复制代码
  // 检查源文件是否存在
  if (lstat(argv[1], &src_stat) == -1)
  {
    perror("Source file/directory error");
    return 1;
  }

目标:存在+是目录 ------> 把文件 复制到该目录 下。将源文件复制到一个已存在的目标目录中,并在目标目录中创建与源文件同名的新文件。如果该文件已经在目标目录中存在,则提示用户选择操作方式(覆盖、追加或取消)。

cpp 复制代码
  char new_path[PATH_MAX];//拼接完整的目录路径
  const char *base = basename(argv[1]);//提取文件名且定义为const变量无法修改,提高安全性
  snprintf(new_path, sizeof(new_path), "%s/%s", argv[2], base);//目标目录+文件名,拼接成新的目录文件

  // 检查目标文件是否已存在
  if (lstat(new_path, &dst_stat) == 0)
  {
    int action = prompt_action(new_path);
    if (action == 0)
      return 0; // 用户取消
    if (action == 1)
      overwrite = 1;
    if (action == 2)
      append = 1;
  }

  return copy_file(argv[1], new_path, overwrite, append);//目录字符串已经实现,接下来就交给copy_file函数了

文件------>文件

cpp 复制代码
// 目标是文件或不存在
      if (dst_exists)
      {
        int action = prompt_action(argv[2]);
        if (action == 0)
          return 0; // 用户取消
        if (action == 1)
          overwrite = 1;
        if (action == 2)
          append = 1;
      }
      return copy_file(argv[1], argv[2], overwrite, append);

目录------>目录

cpp 复制代码
// 源是目录
    if (!dst_exists)
    {
      // 目标不存在,创建目录
      if (mkdir(argv[2], src_stat.st_mode) == -1)
      {
        perror("Failed to create destination directory");
        return 1;
      }
    }
    else if (!S_ISDIR(dst_stat.st_mode))
    {
      fprintf(stderr, "Destination is not a directory\n");
      return 1;
    }
    return copy_dir(argv[1], argv[2], overwrite, append);

4.实验结果

将 文件一 复制成 文件

报错信息:

提示信息:

将 文件 复制到 目录 中:

将目录递归拷贝到另外一个目录中:

相关推荐
鬼手点金6 小时前
nanoGPT/nanochat 能做出 DeepSeek/Qwen 这样的大模型吗?
服务器·前端·javascript·bug·openclaw
贵州诚鑫致达科技有限公司6 小时前
Linux的yum源怎么重启?源不是服务
linux·运维·服务器
遇印记7 小时前
传输层,网络层
运维·服务器·网络·windows·学习
品牌常新8 小时前
景区巡逻机器人怎么选?派宝S5全地形守护解析
运维·人工智能·机器人
Elastic 中国社区官方博客8 小时前
一条 ES|QL 查询,涵盖365天的审计日志:在热数据和可搜索快照上执行相同的搜索
大数据·运维·服务器·elasticsearch·搜索引擎·全文检索
北京中科新远科技9 小时前
高速光模块上线验收实战:DOM、FEC、BER与端口计数器怎么一起看
服务器·网络·php
澜山奕秋9 小时前
RHCSA
linux·运维·服务器
pride.li10 小时前
第03章 Python 教程-基础语法:注释与变量
服务器·前端·后端·python·算法·计算机视觉
Web极客码10 小时前
告别流式截断:我用客户端中间件解决长文本 API 跨国 SSE 断连与数据自愈
linux·agent 图