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)
{
//响应取消请求之后自动处理的例程:释