电子科技大学《linux操作系统编程》实验2:https://www.icourse163.org/learn/UESTC-1003040002?tid=1206878228#/learn/content?type=detail&id=1211971805&cid=1215051733

实现效果:

  • 上述两个
  • 命令参数缺失给出错误提示信息
  • 源文件为目录时给出错误提示信息
  • 目的文件为目录时将源文件在目的目录中复制一份(默认同名)
  • 目的文件已经存在时提供追写/重写选项

实现代码:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <stdbool.h>
//#define printError printf("%s\n", strerror(errno)), exit(1);
#define printError(s)  perror(s), exit(1);
extern int errno;
int max(int a, int b) {return a>=b ? a : b;}
bool isDirectory(char* path)
{struct stat ss;stat(path, &ss);return S_ISDIR(ss.st_mode) ? true : false;
}
int fd_src, fd_tar;//源文件描述符,目标文件描述符
char src[500], tar[500];//源文件路径,目标文件路径
char *buf;//读取源文件内容
char op[30];//目标文件存在时,覆盖还是追加
int src_path_len, tar_path_len, buf_len;//源文件路径/目标文件路径/读取的内容长度
int src_length;//源文件内容大小
int main(int argc, char *argv[])
{//源文件路径和目标文件路径缺失if(argc==1) printf("ERROR:If you want to implement the cp command function, please input the source and target path!\n");//目标文件路径缺失else if(argc==2) printf("ERROR:Please input the target path!\n");else{strcat(src, argv[1]);strcat(tar, argv[2]);if(isDirectory(src))//源路径是目录 报错{printf("ERROR:The source file cannot be a directory!\n");exit(-1);}if((fd_src=open(src, O_RDWR))==-1) printError(src);//源文件不存在或打开失败if((src_length=lseek(fd_src, 0, SEEK_END))==-1) printError(src);//lseek读取源文件大小失败lseek(fd_src, 0, SEEK_SET);//源文件定位到文件首,以便下面进行readbuf = (char*)malloc(sizeof(char)*src_length*10);//动态分配内存,存储源文件内容if(read(fd_src, buf, max(0, src_length-1))==-1) printError(src);//源文件读取内容失败buf[strlen(buf)] = '\n';if(isDirectory(tar))//目标文件是目录,处理出新的目标路径(默认复制后的文件和源文件同名){src_path_len = strlen(src); tar_path_len = strlen(tar);int pos = 0;for(int i = 0; i < src_path_len; i++) if(src[i]=='/') pos=i;if(pos==0) tar[tar_path_len++] = '/';for(int i = pos; i < src_path_len; i++) tar[tar_path_len++] = src[i];}//printf("source path:%s\ntarget path:%s\n", src, tar);if(open(tar, O_RDWR)==-1)//目标文件不存在,则创建该文件{if((fd_tar=open(tar, O_RDWR|O_CREAT, 0666))==-1) printError(tar);//创建目标文件失败}else {printf("Object file already exists, which one do you want to operate, overwrite or append?\n");printf("Please input overwrite or append?\n");scanf("%s", op);while(1){if(op[0]=='o') //覆盖{if((fd_tar=open(tar, O_RDWR|O_TRUNC))==-1) printError(tar);break;}else if(op[0]=='a')//追加{if((fd_tar=open(tar, O_RDWR|O_APPEND))==-1) printError(tar);break;}else printf("Please input overwrite or append?\n");}}if(write(fd_tar, buf, max(0, src_length-1))==-1) printError(tar);//写入文件失败printf("All done!\n");close(fd_src);close(fd_tar);free(buf);}return 0;
}

【linux程序设计】使用POSIX API的文件I/O操作方法仿写cp命令相关推荐

  1. linux posix支持中文,如何在Linux中使用POSIX方法从文件中读取Unicode-16字符串?

    我有一个包含UNICODE-16字符串的文件,我想将其读入Linux程序.字符串是从Windows的内部WCHAR格式原始编写的. (Windows是否总是使用UTF-16?例如日文版) 我相信我可以 ...

  2. Linux服务器开发,Posix API与网络协议栈

    ──────────────────────────────────────────────────────────────── ┌------------┐ │▉▉♥♥♥♥♥♥♥♥ 99% │ ♥❤ ...

  3. linux系统编程快速定位头文件的技巧之强大的grep命令

    这个技巧来自于我的实际开发碰到的: inet_addr这个函数用于把ip地址转成网络字节序,他的原型:in_addr_t inet_addr(const char *cp); 返回值为一个in_add ...

  4. linux8000端口一般是什么端口,linux如何查看端口8000被哪个程序占用?请写详细命令。...

    netstat -tunlp |grep 8000 用这个命令就能看到是哪个程序了,最右面的是程序名 我这没有8000的程序,列一下22的 [root@localhost tmp]# netstat ...

  5. Posix API 与 网络协议栈 详细介绍

    Posix API 与 网络协议栈 前言 Posix API 有哪些 socket bind 三次握手 建立连接的过程 connect listen accept 数据传输 发送与接收 send &a ...

  6. linux cp 目录不存在自动创建,关于linux:Linux技巧cp命令自动创建不存在的目录和只复制修改的文件...

    复制时主动创立不存在的子目录 在 Linux 中,能够应用 cp 命令的 --path 选项指定在复制的时候主动创立不存在的子目录. 例如执行上面的命令: $ cp --path java/com/s ...

  7. Linux查看谁修改的文件,linux如何查看近来修改的文件

    下面用不同的方式只列出所有你今天创建或修改的文件(直接或间接). 1. 使用 ls 命令,只列出你的 home 文件夹中今天的文件. # ls -al --time-style=+%D | grep ...

  8. Linux cp 命令的15个示例 - 创建文件和目录的副本

    拷贝文件和目录是每一个操作系统的基本指令.备份行为基本上是创建文件和目录的副本.在Linux系统下,我们可以用cp命令来实现. copy 命令是什么 正如我们在上文提到的,cp是一个用来创建文件和目录 ...

  9. linux复制文件scp命令,Linux 中的文件复制cp命令和scp命令详解

    Linux 中的文件复制cp命令和scp命令详解 在使用操作系统的使用过程中,常常需要复制文件到本地或者传输文件到其他电脑上,这时候用到两个命令cp和scp. cp命令用来复制文件或者目录.scp是s ...

  10. 【Linux】一步一步学Linux——cp命令(31)

    00. 目录 文章目录 00. 目录 01. 命令概述 02. 命令格式 03. 常用选项 04. 参考示例 05. 附录 01. 命令概述 cp命令可以理解为英文单词copy的缩写,其功能为复制文件 ...

最新文章

  1. Redis 笔记(14)— 持久化及数据恢复(数据持久方式 RDB 和 AOF、数据恢复、混合持久化)
  2. #我要10000+# 计划启动啦!让文章拥有更多曝光~
  3. WInform中实现设置ZedGraph中曲线的X轴与Y轴的上限与下限
  4. [Python人工智能] 二十九.什么是生成对抗网络GAN?基础原理和代码普及(1)
  5. java内核_测量时间:从Java到内核再到
  6. Python数据类型-元组类型
  7. 《Android 应用测试指南》——第2章,第2.4节包浏览器
  8. 利用colab训练YOLOv5
  9. Freemarker中通过request获得contextPath
  10. 如何做好软件测试管理工作,如何才能做好软件测试工作
  11. 面向对象,MATLAB的自定义类
  12. 联想台式主机拆机教程_联想r400拆机教程 拆解电脑没那么难
  13. 超级课程表查成绩显示服务器错误,超级课程表怎么查询期末成绩
  14. C# 霍尼韦尔扫码枪扫码打印
  15. 请写出一段 python 代码实现删除一个 list 里面的重复元素
  16. 金融统计分析python论文_金融统计分析论文选题.docx
  17. 微金所案例总结——Bootstrap应用模板引擎的使用
  18. 程序员,如何从平庸走向理想?
  19. 【牛客刷题22】数根与星际密码
  20. 钢笔朝花夕拾录————一位钢笔玩家的入坑至出坑心路历程

热门文章

  1. 搭建Web和FTP站点
  2. 国内外网站设计与浏览习惯的差异
  3. 【Docker】总集篇
  4. java循环写出多个jlabel_java – 允许多个JLabel中的文本重叠
  5. 阿里巴巴Java开发文档2020版学习-代码格式
  6. Android意图Intent总结代码
  7. c语言指向读取的字节数的指针,c - C语言中指针的大小 - SO中文参考 - www.soinside.com...
  8. hbase put 写入数据慢_HBase运维 | HBase 疑难杂症诊治
  9. Canvas 实现小程序动画
  10. js es6 map 与 原生对象区别