C语言实现Linux cp命令
前言
1.linux cp 命令用来将一个或多个源文件或者目录复制到指定的目的文件或目录。
2.它可以将单个源文件复制成一个指定文件名的具体的文件或一个已经存在的目录下。
3. cp 命令还支持同时复制多个文件,当一次复制多个文件时,目标文件参数必须是一个已经存在的目录,否则将出现错误。
4. cp命令:
// linux终端
cp -[Rrls] 源文件 SOURCE 目标文件 DEST
学习内容
Linux cp 命令的用法。
系统调用 open, opendir 函数的使用
系统调用 careat 函数的使用
系统调用 read, readdir 函数的使用
系统调用 write 函数的使用
系统调用 close 函数的使用
系统调用 open 函数的使用
系统调用 link, symlink 函数的使用
函数 getopt 的使用
C 语言字符串处理
开始
首先我们知道cp后的一系列指令均为命令行参数所以我们需要接收cp后的命令参数这里我们选择getopt(分析命令行参数“unistd.h“头文件)
int getopt(int argc, char * const argv[], const char * optstring);
通俗易懂版链接—超通俗易懂getopt
因为cp后面的选项-[Rrls]无参数所以判断选项代码如下
while ((c = getopt(argc, argv, "rRls")) != -1)
{
switch (c)
{
/*若有-r,-R,则将标记递归地复制目录项的选项(opt_r)置为真*/
case 'R':
case 'r':
opt_r = true;
break;
/*若有-l,则将标记创建硬链接的选项(opt_l)置为真*/
case 'l':
opt_l = true;
break;
/*若有-s,则将标记创建符号链接的选项(opt_s)置为真*/
case 's':
opt_s = true;
break;
}
}
文件或目录拷贝
cp最主要的功能就是进行文件拷贝,显然读操作时(读源文件时是读操作)需要用到open() system_call,对于open()的运用我也贴一个link链接—open系统调用详解,而拷贝后写文件到目标文件则是通过read()和write()读入写入完成复制
文件拷贝整体代码如下
int copyF2F(char *src_file, char *dest_file)
{
int in_fd, out_fd, n_chars;
char buf[BUFFERSIZE];
/*如果目标文件是一个目录,那么默认是在该目录下建立一个与源文件同名的文件*/
if (isdir(dest_file))
{
char c;
char temp[10] = { '\0' };
char *r_temp;
int n = strlen(src_file);
int m = 0;
/*读取源文件的最后一级文件名作为目标文件名*/
while ((c = src_file[n - 1]) != '/')
{
temp[m] = c;
m++;
n--;
}
r_temp = strrev(temp);
strcat(dest_file, r_temp);
}
/* 以可读模式打开源文件 */
if ((in_fd = open(src_file, O_RDONLY)) == -1)
{
printf("%s文件读取失败!",src_file);
return 1;
}
/* O_WRONLY代表以读写的方式打开目标文件,O_CREAT选项代表若文件不存在则创建,
COPYMORE = 0644,文件所有者可读可写,其他可读 */
if ((out_fd = open(dest_file, O_WRONLY | O_CREAT, COPYMORE)) == -1)
return 1;
/* 通过read和write系统调用实现文件的复制 */
while ((n_chars = read(in_fd, buf, BUFFERSIZE)) > 0)
{
if (write(out_fd, buf, n_chars) != n_chars)
{
printf("%s文件写失败!", dest_file);
return 1;
}
if (n_chars == -1)
{
printf("%s文件读取失败!", src_file);
return 1;
}
}
/* 关闭文件 */
if (close(in_fd) == -1 || close(out_fd) == -1)
{
printf("文件关闭失败!");
return 1;
}
return 0;
}
同理目录拷贝原理类似但考虑到递归需要对指针有一定的了解
最后
最后就是主函数的封装,这一部分就需要一定的想象力,对比自己在Linux终端上输入命令出现的错误不断地完善自己的判断语句做到对每一种结果都有返回而不是无响应,最终成型代码在我的Github上喜欢的可以点个star!!!
归档完毕
zyb666-omg的GitHub