一、分析
cp命令就是拷贝命令
在Linux中Cp命令实现的功能:
(1)cp 源路径/源文件 目标路径
(2)cp 源路径/源文件1 源路径/源文件2… 目标路径
(3)cp 源路径/源文件 源路径/目的文件名
二、代码实现
#include <stdio.h>
#include <sys/stat.h> //调用stat()
#include <fcntl.h> //打开、创建文件的头文件
#include <unistd.h> //写入、关闭文件的头文件
#include <string.h>
#include <stdlib.h>
void CopyFile(char *src, char *des, int flag)
{
//只读打开源文件
int fdr = open(src, O_RDONLY);
if(fdr < 0)
{
printf("Open fail\n");
}
//保存目标文件的路径和名字
char desk[128] = { 0 };
//最后一个文件是目录
if(flag)
{
//处理源文件名称
char *filename = NULL;
//判断源文件中是否含有"/"路径
if(strstr(src, "/") == NULL)
filename = src; //不含路径
else
{
//让filename移动到源文件名的最后
filename = src + strlen(src);
while(*filename != '/') filename--;
//让filename移动到倒数第一个'/'的后一位
filename++;
}
//处理:路径/目标文件
//最终目标目录文件为 :目标目录/复制的源文件名
// test/b.txt
strcat(desk, des);
strcat(desk, "/");
strcat(desk, filename);
}
else
{
strcat(desk, des);
}
//打开目标文件,以只写、没有则创建、有的话清空其内容
int fdw = open(desk, O_WRONLY | O_CREAT | O_TRUNC, 0664);
if(fdw < 0)
{
printf("Create fail\n");
exit(0);
}
//写入目标文件
while(1)
{
char buf[128] = {0};
int n = read(fdr, buf, 127);
//如果读入的字节数小于等于0
if(n <= 0) break;
write(fdw, buf, n);
}
close(fdr);
close(fdw);
}
int main(int argc, char *argv[])
{
//参数小于3,直接退出
if(argc < 3)
{
printf("agrument not enough!\n");
return 0;
}
//定义st,存储最后一个文件的信息
struct stat st;
stat(argv[argc - 1], &st);
//判断参数是否为3,并且看最后一个文件是否是目录文件
if(argc == 3 && !S_ISDIR(st.st_mode))
{
//参数为3,并且不是目录文件,就将源文件复制一份给目标文件
CopyFile(argv[1], argv[2], 0);
return 0;
}
//若上述为没执行,说明是多个文件或者最后一个不是目录文件
//如果最后一个不是目录文件
if(!S_ISDIR(st.st_mode))
{
printf("%s is not dir\n", argv[argc - 1]);
return 0;
}
//剩余情况就是多个文件并且最后一个文件是目录
for(int i = 1; i < argc - 1; i++)
{
CopyFile(argv[i], argv[argc - 1], 1);
}
return 0;
}
三、测试结果