cp -r的实现

#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;
}

 

猜你喜欢

转载自blog.csdn.net/qq_43496435/article/details/114233146
cp