多格式过滤器
用迅雷下载文件时间久了 TDDOWNLOAD 文件下一大堆文件,各式各样,想把他们归类整理一番,若在Linux和Window下可以用命令直接搞定,不过命令对普通用户不友好,本着实践态度,外加好友的需要,特制作一下。
文件复制部分不必说,就是一个Qt文件复制API,如果需要就递归一下 ;关键在过滤器这里,就是要实现一次复制多个指定格式的文件,用Qt自带的过滤一次只能抓取一种格式,一次多种格式好像没法了 ;我的思路是定义一个QString对象,接受例如 :"jpg,png,txt" 类型字符串的输入,然后用 split() 以逗号为分割符分割成QStringList,然后在复制函数中每抓取一个文件便判断QStringList是否包含指定格式文件,如果 contains 则调用 QFile::copy
声明:qCopyDirectory() 出自 wangxinus ,我稍微修改了下。
关键代码如下:
#include <QDir> #include <QFileInfoList> // 别忘了这两个哥们 ........................ QStringList filters; QString filters_t=ui->filters_lineEdit->text(); if (filters_t.isEmpty()) { QMessageBox::information(this,tr("过滤器"),tr("请给出过滤器参数,多个参数可用逗号隔开,如:jpg,png,gif")); return ; }else if (filters_t.contains("*")) { filters=QStringList(QString("*")); }else{ filters=filters_t.split(","); //多参数 } if(qCopyDirectory(from_Dir,to_Dir,filters,true)) QMessageBox::information(this,tr("OK!"),tr("任务已成功完成!")); else QMessageBox::warning(this,tr("出错了"),tr("文件复制过程中出错,可能没有权限或者文件正在使用!")); .................
文件复制及过滤函数如下:
bool Widget::qCopyDirectory(const QDir& fromDir, const QDir& toDir, const QStringList& filters, bool bCoverIfFileExists) { QDir toDir_ = const_cast<QDir&>(toDir); // 转换常量toDir为普通值toDir_,因为后面将要移除目标目录中重名文件,词句等价于QDir toDir_=toDir;Qt好像自动就进行了转换工作... if(!toDir_.exists()) //如果目录不存在 { if(!toDir_.mkdir(toDir_.absolutePath())) //如果创建目录失败 return false; } QFileInfoList fileInfoList = fromDir.entryInfoList(); //... foreach(QFileInfo fileInfo, fileInfoList) { if(fileInfo.fileName() == "." || fileInfo.fileName() == "..") continue; if(fileInfo.isDir()) //拷贝子目录 { if(!qCopyDirectory(fileInfo.filePath(), toDir_.filePath(fileInfo.fileName()),filters,bCoverIfFileExists)) //递归调用拷贝 return false; } else //拷贝子文件 { if(bCoverIfFileExists && toDir_.exists(fileInfo.fileName())) { toDir_.remove(fileInfo.fileName()); } if(filters.contains("*")) { if(!QFile::copy(fileInfo.filePath(), toDir_.filePath(fileInfo.fileName()))) //文件复制API { return false; } } else if(filters.contains(fileInfo.completeSuffix())) //如果包含指定扩展名的文件,则毫不客气——带走! { if(!QFile::copy(fileInfo.filePath(), toDir_.filePath(fileInfo.fileName()))) //文件复制API { return false; } } } } return true; }
posted on 2012-04-13 13:28 hicjiajia 阅读(1188) 评论(0) 编辑 收藏 举报