Linux多级目录拷贝

本文介绍如何使用线程池和数据结构编程实现Linux多级目录的拷贝功能,包括详细步骤和关键点,如递归读取目录、线程池任务调度、进度条显示及自定义tree函数应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

                                   Linux多级目录拷贝

一、项目介绍 

       利用线程池跟数据结构编程实现多级目录的拷贝功能。

二、代码功能

        1、线程池编程实现多级目录拷贝;

        2、记录多级目录拷贝的时间;

        3、实现显示多级目录拷贝的进度条;

        4、利用自定义的tree函数实现tree某个路径下的文件。

三、关键点

       1、利用递归思想读取旧目录下的文件、拼接好成旧的路径名,同时生成拼接好新目录的文件路径名;

       2、定义个文件复制函数,将新旧文件路径名定义成一个结构体作为复制函数的参数,当读取到一个旧目录下的文件路径名时,就将复制函数添加到线程池的任务队列中;

      3、目录拷贝的进度条显示则先需要读取旧目录下的总字节数(跟递归读取目录下文件的思维类似,用  int stat(const char *file_name, struct stat *buf)函数可读取文件的信息,其中包括文件大小),然后跟进行复制时已经读写好的字节数形成一个比例,根据这个就可以实现进度条的实现;

      4、目录拷贝的时间显示则需要用到time()函数;

      5、自定义tree函数的功能实现也需要用到递归函数。

四、代码实现

          (一、main函数)

include "main.h"

int main(int argc, char*argv[]){
	if(argc!=3)
	{
		perror("input error!\n");
		exit(1);
	}
	new_len = 0; //当前复制的字节数
	old_len = 0;//旧目录的总字节
	
	//初始化一个带有20条线程的线程池
	thread_pool *pool = malloc(sizeof(thread_pool));
	init_pool(pool,20);
	//新旧文件路径申请堆空间
	struct path *mypath=malloc(sizeof(struct path));
	strcpy(mypath->old_path,argv[1]);
	strcpy(mypath->new_path,argv[2]);
	mypath->pool = pool;
	
	while(1)
	{
		printf("\n*************************\n");
		printf("1:复制所有目录文件\n");
		printf("2:tree旧目录文件\n");
		printf("3:tree新目录文件\n");
		printf("4:tree任意目录文件\n");
		printf("5:退出\n");
		printf("请选择你想要的功能\n");
		scanf("%d",&num);
		switch(num)
		{
			case 1:
				{
					start =time(NULL);
					get_dsize(argv[1]);
					printf("【文件一的大小】:%ld\n",old_len);
					add_task(pool,progress,NULL);
					add_task(pool,search_dir,(void *)mypath);	//投入任务队列	
					while(new_len!=old_len);
					end =time(NULL);
					long second= (end-start);
					printf("耗时:%ld\n",second);
					break;
					
				}
			case 2:
				{
					MyTree(argv[1],0);
					break;
				}
			case 3:
				{
					MyTree(argv[2],0);
					break;
				}
			case 4:
				{
					char buf[256];
					bzero(buf,sizeof(buf));
					printf("请输入你要查看的目录\n");
					scanf("%s",buf);
					MyTree(buf,0);
					break;
				}
			case 5:
				{
					 return 0;
				}		
		}
	}	
	//销毁线程池
	destroy_pool(pool);
	
	return 0;
}

  (二、线程池函数)

#include "thread_pool.h"
void handler(void *arg)
{
	//响应取消请求之后自动处理的例程:释
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值