Qt递归拷贝和删除目录
最近在翻看项目代码时,看到了这两个函数,想到这个功能十分常用,因此拿出来与大家分享,希望对大家有用。几点说明:
1、记得当初写代码那会,是参考了网上的帖子写的,做了一点小修改。因此代码源于网络。
2、同时感谢原作者,只可惜当时没能记下原文网址,实在抱歉!刚才搜了一下,也没搜着,大家若发现原文出处,请跟帖提醒。谢谢!
3、到目前为止,代码在项目中测试、运行正常,大家若使用时发现Bug,请跟帖指出,我待验证后会及时修改更新。谢谢!
- bool copyDir(const QString &source, const QString &destination, bool override)
- {
- QDir directory(source);
- if (!directory.exists())
- {
- return false;
- }
- QString srcPath = QDir::toNativeSeparators(source);
- if (!srcPath.endsWith(QDir::separator()))
- srcPath += QDir::separator();
- QString dstPath = QDir::toNativeSeparators(destination);
- if (!dstPath.endsWith(QDir::separator()))
- dstPath += QDir::separator();
- bool error = false;
- QStringList fileNames = directory.entryList(QDir::AllEntries | QDir::NoDotAndDotDot | QDir::Hidden);
- for (QStringList::size_type i=0; i != fileNames.size(); ++i)
- {
- QString fileName = fileNames.at(i);
- QString srcFilePath = srcPath + fileName;
- QString dstFilePath = dstPath + fileName;
- QFileInfo fileInfo(srcFilePath);
- if (fileInfo.isFile() || fileInfo.isSymLink())
- {
- if (override)
- {
- QFile::setPermissions(dstFilePath, QFile::WriteOwner);
- }
- QFile::copy(srcFilePath, dstFilePath);
- }
- else if (fileInfo.isDir())
- {
- QDir dstDir(dstFilePath);
- dstDir.mkpath(dstFilePath);
- if (!copyDir(srcFilePath, dstFilePath, override))
- {
- error = true;
- }
- }
- }
- return !error;
- }
QtCreator版本(在阅读 QtCreator 源码时,看到一个和以上功能一样的函数,想必像QtCreator这样的项目代码质量比我等程序员的代码质量更高。因此,特摘抄下来已做更新):
- // taken from utils/fileutils.cpp. We can not use utils here since that depends app_version.h.
- static bool copyRecursively(const QString &srcFilePath,
- const QString &tgtFilePath)
- {
- QFileInfo srcFileInfo(srcFilePath);
- if (srcFileInfo.isDir()) {
- QDir targetDir(tgtFilePath);
- targetDir.cdUp();
- if (!targetDir.mkdir(QFileInfo(tgtFilePath).fileName()))
- return false;
- QDir sourceDir(srcFilePath);
- QStringList fileNames = sourceDir.entryList(QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot | QDir::Hidden | QDir::System);
- foreach (const QString &fileName, fileNames) {
- const QString newSrcFilePath
- = srcFilePath + QLatin1Char('/') + fileName;
- const QString newTgtFilePath
- = tgtFilePath + QLatin1Char('/') + fileName;
- if (!copyRecursively(newSrcFilePath, newTgtFilePath))
- return false;
- }
- } else {
- if (!QFile::copy(srcFilePath, tgtFilePath))
- return false;
- }
- return true;
- }
- bool deleteDir(const QString &dirName)
- {
- QDir directory(dirName);
- if (!directory.exists())
- {
- return true;
- }
- QString srcPath = QDir::toNativeSeparators(dirName);
- if (!srcPath.endsWith(QDir::separator()))
- srcPath += QDir::separator();
- QStringList fileNames = directory.entryList(QDir::AllEntries | QDir::NoDotAndDotDot | QDir::Hidden);
- bool error = false;
- for (QStringList::size_type i=0; i != fileNames.size(); ++i)
- {
- QString filePath = srcPath + fileNames.at(i);
- QFileInfo fileInfo(filePath);
- if (fileInfo.isFile() || fileInfo.isSymLink())
- {
- QFile::setPermissions(filePath, QFile::WriteOwner);
- if (!QFile::remove(filePath))
- {
- qDebug() << "remove file" << filePath << " faild!";
- error = true;
- }
- }
- else if (fileInfo.isDir())
- {
- if (!deleteDir(filePath))
- {
- error = true;
- }
- }
- }
- if (!directory.rmdir(QDir::toNativeSeparators(directory.path())))
- {
- qDebug() << "remove dir" << directory.path() << " faild!";
- error = true;
- }
- return !error;
- }
http://blog.csdn.net/e5max/article/details/11923803
Qt递归拷贝和删除目录的更多相关文章
- Python 文件复制&按目录树结构拷贝&批量删除目录及其子目录下的文件
文件复制&按目录树结构拷贝&批量删除目录及其子目录下的文件 by:授客 QQ:1033553122 测试环境: Python版本:Python 3.3.2 Win7 64 代码实践 # ...
- C#递归拷贝文件删除文件
拷贝文件及子文件,最后一个参数排除,哪个不要删除.(其实就是移动的效果) //拷贝文件及子文件 public static void CopyDirectory(string src, string ...
- linux cp -r chmod -R 递归拷贝 删除 改权限
在linux下拷贝的时候有时候会出现cp:omitting directory的错误 ,例如 cp:omitting directory "bbs" 说明bbs目录下面还有目录,不 ...
- xcopy递归拷贝
递归拷贝 ::xcopy SOURCE_DIR DES_DIR\ /s SOURCE_DIR后面不需要加反斜杠
- 递归拷贝目录与删除目录 WindowsAPI C++
/*判断一个路径是否是已存在的目录*/ bool IsDirectory(const std::wstring& pstrPath) { DWORD dw = GetFileAttribute ...
- 如何用Qt自动拷贝exe依赖的dll
QT生成的.exe文件不能运行的解决办法 之前的数独项目的GUI,当我的Qt项目生成exe时,由于缺少了相关的依赖dll文件,打开会一直报缺少依赖文件的错: 然后一开始我到安装的Qt文件夹里把这些有Q ...
- QT程序拷贝 转移 改变运行环境
qt程序 在windows平台下怎么运行? 以前开发环境是VS2008编译 +qt-win-opensource-4.7.4-vs2008框架 +QtCreator编辑界面(以前的例子,win7下成功 ...
- [QT学习]拷贝文件
sourceDir源绝对路径,toDir目标绝对路径 //拷贝文件: bool FileOperation::copyFileToPath(QString sourceDir ,QString toD ...
- windows递归拷贝(或删除等操作)文件
SHFileOperation 以拷贝为例. CString strFrom = ....._T("src");CString strTo = ....._T("dest ...
随机推荐
- iOS NSRuntime机制
什么是Objective-C runtime? 简单来说,Objective-C runtime是一个实现Objective-C语言的C库.对象可以用C语言中的结构体表示,而方法(methods)可以 ...
- 递推,大数存储E - Order Count
Description If we connect 3 numbers with "<" and "=", there are 13 cases: 1) ...
- E - Phone List(字典序,string类型使用)
Description Given a list of phone numbers, determine if it is consistent in the sense that no number ...
- [Swust OJ 541]--排列字典序问题
题目链接:http://acm.swust.edu.cn/problem/0541/ Time limit(ms): 2000 Memory limit(kb): 65535 n个元素{1,2,... ...
- excel unixtime与北京时间互转
unixtime转北京时间,在单元格内输入:=INT((B2-70*365-19)*86400-8*3600) *.要设置一下单元格格式为y-m-d h:m:s才会正确显示 北京时间转unixti ...
- CodeForces 294B Shaass and Bookshelf 【规律 & 模拟】或【Dp】
这道题目的意思就是排两排书,下面这排只能竖着放,上面这排可以平着放,使得宽度最小 根据题意可以得出一个结论,放上这排书的Width 肯定会遵照从小到大的顺序放上去的 Because the total ...
- Qt学习:线程间共享数据(使用信号槽传递数据,必须提前使用qRegisterMetaType来注册参数的类型)
Qt线程间共享数据主要有两种方式: 使用共享内存.即使用一个两个线程都能够共享的变量(如全局变量),这样两个线程都能够访问和修改该变量,从而达到共享数据的目的: 使用singal/slot机制,把数据 ...
- thinkphp 分组、页面跳转与ajax
本节课大纲: 一.多应用配置技巧 二.使用分组 三.页面跳转 $this->success('查询成功',U('User/test')); $this->redirect('User/te ...
- Hadoop集群配置(最全面总结)
Hadoop集群配置(最全面总结) 通常,集群里的一台机器被指定为 NameNode,另一台不同的机器被指定为JobTracker.这些机器是masters.余下的机器即作为DataNode也作为Ta ...
- oschina开源硬件其它开源,开源硬件
硬件驱动/工具 25Linux内核 101桌面环境 40开源字体 58嵌入式操作系统 33输入法 110开源硬件 57开源图书 5开源家居 17物联网 87开源货币/比特币 32NASA 开源项目 1 ...