#include <func.h>
// ./cp src dest
int cpFile(char *old_path , char *new_path)
{
int fdr = open(old_path , O_RDONLY);//以只读方式打开要cp的文件
ERROR_CHECK(fdr , -1 , "open");
int fdw = open(new_path , O_WRONLY | O_CREAT | O_TRUNC , 0666);//以只写方式新建文件,若文件存在则长度被截为0
ERROR_CHECK(fdw , -1 , "open");
char buf[4096] = { 0 };
while (1)
{
memset(buf , 0 , sizeof(buf));
int ret = read(fdr , buf , sizeof(buf));//读文件
if (ret == 0)//读到终止符'\0'
{
break;
}
write(fdw , buf , ret);//写文件
}
close(fdr);
close(fdw);
return 1;
}
//递归复制
int cpDFS(char *old_path , char *new_path)
{
DIR *pdir1 = opendir(old_path);
ERROR_CHECK(pdir1 , NULL , "opendir");
struct dirent *pdirent;
while ((pdirent = readdir(pdir1)))
{
if (!strcmp(pdirent->d_name , ".") || !strcmp(pdirent->d_name , ".."))
{//.和..文件不操作
continue;
}
//进行cp操作的文件路径名
char old[512] = { 0 };
char new[512] = { 0 };
sprintf(old , "%s%s%s" , old_path , "/" , pdirent->d_name);
sprintf(new , "%s%s%s" , new_path , "/" , pdirent->d_name);
if (pdirent->d_type == DT_DIR)
{//是目录,接着递归
int ret = mkdir(new , 0777);//创建目录
ERROR_CHECK(ret , -1 , "mkdir");
cpDFS(old , new);
}
else
{//是文件,复制
cpFile(old , new);
}
}
closedir(pdir1);
return 0;
}
// ./cp dir1 dir2
int main(int argc , char *argv[])
{
ARGS_CHECK(argc , 3);
cpDFS(argv[1] , argv[2]);
return 0;
}