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

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

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

实现要求:

1.要求支持文件的复制,文件夹(包括里面的文件和子文件夹)的复制
2.多线程实现,调用时不可长期占用系统资源
3.需要汇报复制进度

问题由来:

Linux系统没有提供编程copy的接口,只是在命令行下提供了cp的命令。当使用system执行cp命令时,会占用系统资源,而其不能实时报告复制进度。当在主进程中使用自己的copy实现时,可以使用Qt的Signal-slot机制报告进度时,对话框只能在复制结束后显示出来,依然存在问题。
故改用多线程实现copy功能,并进行实时报告进度。

定义接口:

bool copy(const char* from, const char* to);
对使用者来说,不区分是目录还是文件,均可复制。

bool copyFile(const char* oldFile, const char* newFile);
复制文件,其内部则是创建一个单独的线程去完成复制,线程复制完成后,该函数才会返回。

bool copyDir(const char* oldDir, const char* newDir);
复制一个目录,它会遍历该目录下所有的项。若是文件,则调用上面的copyFile函数,若是文件夹则递归调用自己。

 

具体实现:
Copy的实现
若是目录,则递归复制它里面的文件和子文件夹。为简单起见,只支持目录和普通的文件。不支持符号链接等特殊的文件。   它内部调用如下两个函数分别copy文件和目录的两种情况。具体代码为:

bool CopyUtil::copy(const char* from, const char* to)

{
canceled=false;
struct stat fileStat;
if(-1 == stat(from, &fileStat))
{
fprintf(stderr, “file %s doesn’t exist!n”, from);
return false;
}

if(S_ISREG(fileStat.st_mode))
return copyFile(from, to);
else if(S_ISDIR(fileStat.st_mode))
return copyDir(from, to);
else
{
fprintf(stderr, “%s isn’t a file or directory, not be supported!n”, from);
return false;
}
}

 

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

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

    分享到:

相关文章:

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