• 5742阅读
  • 4回复

[提问]求教Qt如何实现文件夹复制,同时显示复制进度? [复制链接]

上一主题 下一主题
离线cfxks1989
 

只看楼主 倒序阅读 楼主  发表于: 2013-02-28
如题:
文件夹复制,网上倒是有不少的资料,但是我希望在复制的同时能有进度对话框显示复制的进度这类信息。
不知道这个该如何实现啊?从哪里获取文件的处理进度啊?
离线roywillow

只看该作者 1楼 发表于: 2013-02-28
我好想在哪看到过这种其他人写的对话框组件,不过真心想不起来在哪了……
或者调用系统api,windows下有个shell api是直接调用资源管理器那个复制功能
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线hitler++

只看该作者 2楼 发表于: 2013-03-01
能实现,用QFile 读取文件,然后用QFile 写入目标文件,然后widget上放个进度条 ,range 设置为文件字节数量 ,每写完多少字节,然后更新到这个QProgress上面.只能这样手工实现,没有能够直接调用的高层函数可以知道进度的
离线mpfishere
只看该作者 3楼 发表于: 2013-03-01
  1. #include <QDate>
  2. #include <QDir>
  3. #include <WTypes.h>
  4. #include <ShellAPI.h>
  5. #include <tchar.h>
  6. #include <WinNT.h>
  7. #pragma comment(lib, "shell32.lib")
  8. #ifdef UNICODE  
  9. #define QStringToTCHAR(x)     (wchar_t*) x.utf16()  
  10. #define PQStringToTCHAR(x)    (wchar_t*) x->utf16()  
  11. #define TCHARToQString(x)     QString::fromUtf16((x))  
  12. #define TCHARToQStringN(x,y)  QString::fromUtf16((x),(y))  
  13. #else  
  14. #define QStringToTCHAR(x)     x.local8Bit().constData()  
  15. #define PQStringToTCHAR(x)    x->local8Bit().constData()  
  16. #define TCHARToQString(x)     QString::fromLocal8Bit((x))  
  17. #define TCHARToQStringN(x,y)  QString::fromLocal8Bit((x),(y))  
  18. #endif
  19. void CCopyFileThread::run()
  20. {
  21. int iCurFileIndex = 0;
  22. QDir oDir;
  23. oDir.mkpath("D:/" + QDate::currentDate().toString("yyyyMMdd")); // 目标路径
  24. while (!mbStopped)
  25. {
  26.   // 要上传的文件列表
  27.   if (g_LstopUploadFile.size() == 0)
  28.   {
  29.    continue;
  30.   }
  31.   if (iCurFileIndex == g_LstopUploadFile.size())
  32.   {
  33.    emit msigLocalCopyDone(false);
  34.    mbStopped = true;
  35.    continue;
  36.   }
  37.   CFileInfo *opFileInfo = g_LstopUploadFile.at(iCurFileIndex);
  38.   QString strAbsFileName = opFileInfo->msGetAbsoluteFilePath();
  39.   QString strSrc = strAbsFileName;
  40.   QString strTgt("D:\\" + QDate::currentDate().toString("yyyyMMdd") + "\\" + opFileInfo->msGetFileName());
  41.   TCHAR tmpsrcpath[1024];
  42.   TCHAR tmpdespath[1024];
  43.   ZeroMemory(tmpsrcpath, 1024*sizeof(TCHAR));
  44.   ZeroMemory(tmpdespath, 1024*sizeof(TCHAR));
  45.   int iSrcLength = strSrc.toWCharArray(tmpsrcpath);
  46.   int iTgtLength = strTgt.toWCharArray(tmpdespath);
  47.   tmpsrcpath[iSrcLength+0] = TCHAR('\0');
  48.   tmpsrcpath[iSrcLength+1] = TCHAR('\0');
  49.   tmpsrcpath[iSrcLength+2] = TCHAR('\0');
  50.   tmpdespath[iTgtLength+0] = TCHAR('\0');
  51.   tmpdespath[iTgtLength+1] = TCHAR('\0');
  52.   tmpdespath[iTgtLength+2] = TCHAR('\0');
  53.   SHFILEOPSTRUCT lpsh;
  54.   ZeroMemory(&lpsh, sizeof(lpsh));
  55.   lpsh.hwnd = HWND_DESKTOP;
  56.   lpsh.fFlags = FOF_RENAMEONCOLLISION; // 有重名文件时自动添加“复件”前缀
  57.   lpsh.wFunc = FO_COPY;     // 拷贝文件
  58.   lpsh.pFrom = tmpsrcpath;    // 源文件路径
  59.   lpsh.pTo = tmpdespath;     // 目标路径
  60.   if (0 != SHFileOperation(&lpsh))
  61.   {
  62.    mbStopped = true;
  63.    break;
  64.   }
  65.   // 开始传输下一个文件
  66.   iCurFileIndex++;
  67. }
  68. mbStopped = false;
  69. }

以前做过的项目代码,LZ参考一下吧,只要把源文件夹中的文件遍历一下放到g_LstopUploadFile里就可以了
离线ericjin

只看该作者 4楼 发表于: 2013-03-01
Qt example and demo 中有个Find File Dailog, 你可以参照一下
快速回复
限100 字节
 
上一个 下一个