首页 > C/C++/Linux, Qt > Linux下copy API的多线程实现(1)–总体介绍(2)

Linux下copy API的多线程实现(1)–总体介绍(2)

2009-07-08 16:37 星期三    浏览: 1,602    绿 发表评论 阅读评论

copyDir的实现

复制一个目录,它会遍历该目录下所有的项。若是文件,则调用copyFile函数,若是文件夹则递归调用自己。当为目录时,我们需要mkdir目录,然后遍历该目录下的文件(调用copyFile)或文件夹(递归调用自己)。于是,复制一个目录的场景如下:复制其中的文件时,调用copyFile函数,后者启动一个线程,直至线程结束返回后,该函数也接着返回;然后再复制其它文件。遇到子文件夹,则创建之,然后递归重复上述过程。

具体代码:

bool flag=!( mkdir(newDir, S_IRWXU|S_IRWXG|S_IRWXO));
struct stat fileStat;

DIR *dp=opendir(oldDir);
if (dp)  {
struct dirent *ep;
while( (ep =readdir(dp) ) != NULL )
{
if (0 != strcmp(ep->d_name, “.”) && 0 != strcmp(ep->d_name, “..”))
{
char path1[PATH_MAX];
char path2[PATH_MAX];
strcpy(path1,oldDir);
strcpy(path2, newDir);
strcat(path1, “/”);
strcat(path1, ep->d_name);
strcat(path2, “/”);
strcat(path2, ep->d_name);
if(-1 == stat(path1, &fileStat))
{
fprintf(stderr, ” To be copied file %s doesn’t exist!n”, path1);
continue;
}
if(S_ISREG(fileStat.st_mode))
flag =copyFile(path1, path2)||flag;
else if(S_ISDIR(fileStat.st_mode))
flag =copyDir(path1, path2)||flag ; //recursive call
/*   //why not work on board?
if(ep->d_type==DT_DIR)
flag =copyDir(path1, path2)||flag ; //recursive call
if(ep->d_type==DT_REG)
flag =copyFile(path1, path2)||flag;
// else //ignore

*/
}

} //while
closedir(dp);
}
return flag;

copyFile的实现

复制文件,其内部则是创建一个单独的线程去完成复制,线程复制完成后,该函数才会返回。同时,在该函数中,要不断报告复制进度,见后文细述。
bool CopyUtil::copyFile(const char* oldFile, const char* newFile)
{
struct stat fileStat;
stat(oldFile, &fileStat);
emit ReportCurrentFileSize(fileStat.st_size);
if(fileStat.st_size==0)
{
FILE* fp;
if((fp=fopen(newFile,”wb”))==NULL)
{
fprintf(stderr, “Failed to open the file %s to write.n “, newFile);

}
fclose(fp);
return true;
}
void** files=(void**)malloc(sizeof(void*)*2);
*files=(void*)oldFile;
*(files+1)=(void*)newFile;

pthread_t id;
int ret=pthread_create(&id, NULL, copyThread, (void*)files);
if(ret)
{
fprintf (stderr, “Create pthread error!n”);
return 0;
}
#if 1

//TODO: calculate the data info and emit Qt signal
/*
emit copyScale( thisTime, BufferSize*i);// report the progress every 1% or 1MB
emit completePercentage(i/reportPoint);
emit hasCopied(copied);
*/
//let code enter the above thread, insted of the following infinite loop
::usleep(SleepTime);
while(1)
{
#ifdef TO_SYNC
pthread_mutex_lock(&mutex);
pthread_cond_wait(&cond,&mutex);
#endif
emit ReportCurrentFileName(currentFile);
emit copyScale(consumedTime , copiedBytes);// report the progress every 1% or 1MB
emit completePercentage(percentage);
emit hasCopied(g_copied);
//we must lock the show code and unlock until it completely display on LCD
//here is very very important!!!
QCoreApplication::processEvents();
if(can_exit)
{
can_exit=false;
break;
}
#ifdef TO_SYNC
pthread_mutex_unlock(&mutex);
#endif
}
#endif
void* tret;
pthread_join(id, &tret);
//     if(!tret)
//            unlink(newFile);
free(files);
return (int)tret;

}

本文链接地址: http://blog.redwolf-soft.com/?p=593

原创文章,版权©红狼博客所有, 转载随意,但请注明出处。

    分享到:

相关文章:

  • 无相关文章
分类: C/C++/Linux, Qt 标签: ,
  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.
订阅评论
  欢迎参与讨论,请在这里发表您的看法、交流您的观点。