当前位置: 首页 > news >正文

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.核心代码分析

确保有两个额外的传递参数:argc[0](程序名),argc[1],argc[2]

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

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

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

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

  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函数了

文件——>文件

// 目标是文件或不存在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);

目录——>目录

// 源是目录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.实验结果

将 文件一 复制成 文件

报错信息:

提示信息:

将 文件 复制到 目录 中:

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

http://www.dtcms.com/a/225319.html

相关文章:

  • RuoYi前后端分离框架实现前后端数据传输加密(二)之前端篇
  • 如何用docker部署ELK?
  • 设计模式——观察者设计模式(行为型)
  • 在 SpringBoot+Tomcat 环境中 线程安全问题的根本原因以及哪些变量会存在线程安全的问题。
  • 设计模式——桥接设计模式(结构型)
  • NodeJS全栈开发面试题讲解——P1Node.js 基础与核心机制
  • java servlet: context-path的作用
  • 基于GeoTools和OSM路网求解两条道路相交点-以长沙市为例
  • 视觉分析明火检测助力山东化工厂火情防控
  • 【寻找Linux的奥秘】第九章:自定义SHELL
  • 【Vue 3全栈实战】从组合式API到企业级架构设计
  • 计算机基础——宏病毒防御与网络技术
  • idea中springboot2.7(由于步入另一个线程,已跳过 xxx 处的断点)
  • Go语言中的数据类型转换
  • MATLAB实战:Arduino硬件交互项目方案
  • Codeforces Round 1028 (Div. 2)A题
  • 鸿蒙OSUniApp离线优先数据同步实战:打造无缝衔接的鸿蒙应用体验#三方框架 #Uniapp
  • LeetCode 131.分割回文串:回溯法与回文子串判定的结合
  • MySQ-8.42 MGR 组复制部署及详解
  • 【华为云Astro】从OBS CSV文件获取配置指南
  • uni-app学习笔记十七-css和scss的使用
  • ARINC818编解码设计FPGA实现
  • AR/MR实时光照阴影开发教程
  • mybatis02
  • CSS篇-6
  • pycharm打印时不换行,方便对比观察
  • 多线程( Thread)
  • 【深度学习】 19. 生成模型:Diffusion Models
  • 81、使用DTU控制水下灯光控制
  • ZLG ZCANPro,ECU刷新,bug分享