最近在翻看项目代码时,看到了这两个函数,想到这个功能十分常用,因此拿出来与大家分享,希望对大家有用。几点说明:

1、记得当初写代码那会,是参考了网上的帖子写的,做了一点小修改。因此代码源于网络。

2、同时感谢原作者,只可惜当时没能记下原文网址,实在抱歉!刚才搜了一下,也没搜着,大家若发现原文出处,请跟帖提醒。谢谢!

3、到目前为止,代码在项目中测试、运行正常,大家若使用时发现Bug,请跟帖指出,我待验证后会及时修改更新。谢谢!

  1. bool copyDir(const QString &source, const QString &destination, bool override)
  2. {
  3. QDir directory(source);
  4. if (!directory.exists())
  5. {
  6. return false;
  7. }
  8. QString srcPath = QDir::toNativeSeparators(source);
  9. if (!srcPath.endsWith(QDir::separator()))
  10. srcPath += QDir::separator();
  11. QString dstPath = QDir::toNativeSeparators(destination);
  12. if (!dstPath.endsWith(QDir::separator()))
  13. dstPath += QDir::separator();
  14. bool error = false;
  15. QStringList fileNames = directory.entryList(QDir::AllEntries | QDir::NoDotAndDotDot | QDir::Hidden);
  16. for (QStringList::size_type i=0; i != fileNames.size(); ++i)
  17. {
  18. QString fileName = fileNames.at(i);
  19. QString srcFilePath = srcPath + fileName;
  20. QString dstFilePath = dstPath + fileName;
  21. QFileInfo fileInfo(srcFilePath);
  22. if (fileInfo.isFile() || fileInfo.isSymLink())
  23. {
  24. if (override)
  25. {
  26. QFile::setPermissions(dstFilePath, QFile::WriteOwner);
  27. }
  28. QFile::copy(srcFilePath, dstFilePath);
  29. }
  30. else if (fileInfo.isDir())
  31. {
  32. QDir dstDir(dstFilePath);
  33. dstDir.mkpath(dstFilePath);
  34. if (!copyDir(srcFilePath, dstFilePath, override))
  35. {
  36. error = true;
  37. }
  38. }
  39. }
  40. return !error;
  41. }

QtCreator版本(在阅读 QtCreator 源码时,看到一个和以上功能一样的函数,想必像QtCreator这样的项目代码质量比我等程序员的代码质量更高。因此,特摘抄下来已做更新):

  1. // taken from utils/fileutils.cpp. We can not use utils here since that depends app_version.h.
  2. static bool copyRecursively(const QString &srcFilePath,
  3. const QString &tgtFilePath)
  4. {
  5. QFileInfo srcFileInfo(srcFilePath);
  6. if (srcFileInfo.isDir()) {
  7. QDir targetDir(tgtFilePath);
  8. targetDir.cdUp();
  9. if (!targetDir.mkdir(QFileInfo(tgtFilePath).fileName()))
  10. return false;
  11. QDir sourceDir(srcFilePath);
  12. QStringList fileNames = sourceDir.entryList(QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot | QDir::Hidden | QDir::System);
  13. foreach (const QString &fileName, fileNames) {
  14. const QString newSrcFilePath
  15. = srcFilePath + QLatin1Char('/') + fileName;
  16. const QString newTgtFilePath
  17. = tgtFilePath + QLatin1Char('/') + fileName;
  18. if (!copyRecursively(newSrcFilePath, newTgtFilePath))
  19. return false;
  20. }
  21. } else {
  22. if (!QFile::copy(srcFilePath, tgtFilePath))
  23. return false;
  24. }
  25. return true;
  26. }
  1. bool deleteDir(const QString &dirName)
  2. {
  3. QDir directory(dirName);
  4. if (!directory.exists())
  5. {
  6. return true;
  7. }
  8. QString srcPath = QDir::toNativeSeparators(dirName);
  9. if (!srcPath.endsWith(QDir::separator()))
  10. srcPath += QDir::separator();
  11. QStringList fileNames = directory.entryList(QDir::AllEntries | QDir::NoDotAndDotDot | QDir::Hidden);
  12. bool error = false;
  13. for (QStringList::size_type i=0; i != fileNames.size(); ++i)
  14. {
  15. QString filePath = srcPath + fileNames.at(i);
  16. QFileInfo fileInfo(filePath);
  17. if (fileInfo.isFile() || fileInfo.isSymLink())
  18. {
  19. QFile::setPermissions(filePath, QFile::WriteOwner);
  20. if (!QFile::remove(filePath))
  21. {
  22. qDebug() << "remove file" << filePath << " faild!";
  23. error = true;
  24. }
  25. }
  26. else if (fileInfo.isDir())
  27. {
  28. if (!deleteDir(filePath))
  29. {
  30. error = true;
  31. }
  32. }
  33. }
  34. if (!directory.rmdir(QDir::toNativeSeparators(directory.path())))
  35. {
  36. qDebug() << "remove dir" << directory.path() << " faild!";
  37. error = true;
  38. }
  39. return !error;
  40. }

http://blog.csdn.net/e5max/article/details/11923803

Qt递归拷贝和删除目录的更多相关文章

  1. Python 文件复制&按目录树结构拷贝&批量删除目录及其子目录下的文件

    文件复制&按目录树结构拷贝&批量删除目录及其子目录下的文件 by:授客 QQ:1033553122 测试环境: Python版本:Python 3.3.2 Win7 64 代码实践 # ...

  2. C#递归拷贝文件删除文件

    拷贝文件及子文件,最后一个参数排除,哪个不要删除.(其实就是移动的效果) //拷贝文件及子文件 public static void CopyDirectory(string src, string ...

  3. linux cp -r chmod -R 递归拷贝 删除 改权限

    在linux下拷贝的时候有时候会出现cp:omitting directory的错误 ,例如 cp:omitting directory "bbs" 说明bbs目录下面还有目录,不 ...

  4. xcopy递归拷贝

    递归拷贝 ::xcopy SOURCE_DIR DES_DIR\ /s SOURCE_DIR后面不需要加反斜杠

  5. 递归拷贝目录与删除目录 WindowsAPI C++

    /*判断一个路径是否是已存在的目录*/ bool IsDirectory(const std::wstring& pstrPath) { DWORD dw = GetFileAttribute ...

  6. 如何用Qt自动拷贝exe依赖的dll

    QT生成的.exe文件不能运行的解决办法 之前的数独项目的GUI,当我的Qt项目生成exe时,由于缺少了相关的依赖dll文件,打开会一直报缺少依赖文件的错: 然后一开始我到安装的Qt文件夹里把这些有Q ...

  7. QT程序拷贝 转移 改变运行环境

    qt程序 在windows平台下怎么运行? 以前开发环境是VS2008编译 +qt-win-opensource-4.7.4-vs2008框架 +QtCreator编辑界面(以前的例子,win7下成功 ...

  8. [QT学习]拷贝文件

    sourceDir源绝对路径,toDir目标绝对路径 //拷贝文件: bool FileOperation::copyFileToPath(QString sourceDir ,QString toD ...

  9. windows递归拷贝(或删除等操作)文件

    SHFileOperation 以拷贝为例. CString strFrom = ....._T("src");CString strTo = ....._T("dest ...

随机推荐

  1. Unix/Linux环境C编程新手教程(5) Red Hat Enterprise Linux(RHEL)环境搭建

    Unix/Linux版本号众多,我们推荐Unix/Linux刚開始学习的人选用几款典型的Unix/Linux操作系统进行学习. 通过./a.out ./Y.out运行出结果,证明C++程序编译成功.也 ...

  2. 基于mini2440的IIC读写(裸机)

    mini2440开发板提供的测试代码过于复杂,让人很难理解,而且有些错误,如GPE14-15不能设置上拉电阻,可是代码里却设置了,虽然无关紧要.为了方便学习,我在闲暇之时我研究了一下.IIC的原理是比 ...

  3. 将其它图片格式转为.eps格式

    假设是用origin的话就不存在这个问题. 倘若你是用excel绘图的话. 1.先将excel导出为.pdf文件 2.用Adobe Acrobat Pro 打开pdf,用其它的pdf软件貌似不行 3. ...

  4. linux(Centos 6.3)学习笔记

    一.系统分区    1,磁盘分区        使用分区编辑器(partition editor)在磁盘上划分几个逻辑部分.碟片一旦划分成          数个分区,不同类的目录与文件可以存储进不同 ...

  5. Android ImageView(scaleType属性)图片按比例缩放

    <ImageView android:id="@+id/img" android:src="@drawable/logo" android:scaleTy ...

  6. Maven创建项目: Failed to execute goal org.apache.maven.plugin( mvn archetype:create)

    一.概述: 在使用mvn 命令mvn archetype:create -DgroupId=com.chuanliu.c11 -DartifactId=c11searcher在控制创建maven项目和 ...

  7. Derby的下载安装和使用,(和JAVA中使用Derby)

    首先是Java环境变量要配置: 1.打开我的电脑--属性--高级--环境变量 2.新建系统变量JAVA_HOME 和CLASSPATH 变量名:JAVA_HOME 变量值:C:\Program Fil ...

  8. [置顶] C++ sizeof实例详解

    在C++中使用sizeof要比C复杂很多,因为C++类中有static静态变量,virtual虚函数,还有继承.派生等.sizeof是C语言的一种单目操作符,如C语言的其他操作符++.--等.它并不是 ...

  9. 解决screen Cannot open your terminal '/dev/pts/1'问题

    转载于:http://urchin.blog.51cto.com/4356076/1153322 问题描述: userA首先登录系统,使用screen开启了一个session,然后detach这个窗口 ...

  10. SecureCRT使用Vim出现中文乱码问题的解决

    1. 首先保证securecrt本身显示中文是ok的.如果不是,就先解决这一个问题. 2. vi ~/.vimrc 添加set encoding=utf-8 fileencodings=ucs-bom ...