• 6730阅读
  • 2回复

[共享]多格式过滤器 [复制链接]

上一主题 下一主题
离线hicjiajia
 

只看楼主 倒序阅读 楼主  发表于: 2011-08-21
   暑假一直闷在家里搞高等数学,烦死了,上网有个同学说想要把一个文件夹中的多种格式文件分开处理,其实用CMD就可以了,本着实践的态度自己搞了个小软件。。。


文件复制部分不必说,就是一个Qt文件复制API,如果需要就递归一下 ;关键在过滤器这里,就是要实现一次复制多个指定格式的文件,用Qt自带的过滤一次只能抓取一种格式,一次多种格式好像没法了 ;我的思路是定义一个QString对象,接受例如 :jpg,png,txt 类型字符串的输入,然后用 split() 以逗号为分割符分割成QStringList,然后在复制函数中每抓取一个文件便判断QStringList是否包含指定格式文件,如果 contains 则调用 QFile::copy


声明:qCopyDirectory() 出自 wangxinus  ,我稍微修改了下。


关键代码如下:
  1. #include <QDir>
  2. #include <QFileInfoList>   // 别忘了这两个哥们
  3. ........................
  4. QStringList filters;
  5. QString filters_t=ui->filters_lineEdit->text();
  6. if (filters_t.isEmpty())
  7.     {
  8.         QMessageBox::information(this,tr("过滤器"),tr("请给出过滤器参数,多个参数可用逗号隔开,如:jpg,png,gif"));
  9.             return ;
  10.     }else if (filters_t.contains("*"))
  11.     {
  12.         filters=QStringList(QString("*"));
  13.     }else{
  14.         filters=filters_t.split(",");      //多参数
  15.     }
  16. if(qCopyDirectory(from_Dir,to_Dir,filters,true))
  17.     QMessageBox::information(this,tr("OK!"),tr("任务已成功完成!"));
  18. else
  19.     QMessageBox::warning(this,tr("出错了"),tr("文件复制过程中出错,可能没有权限或者文件正在使用!"));
  20. .................



文件复制及过滤函数如下:
  1. bool Widget::qCopyDirectory(const QDir& fromDir, const QDir& toDir, const QStringList& filters,  bool bCoverIfFileExists)
  2. {
  3.     QDir toDir_ = const_cast<QDir&>(toDir);  // 转换常量toDir为普通值toDir_,因为后面将要移除目标目录中重名文件,词句等价于QDir toDir_=toDir;Qt好像自动就进行了转换工作...
  4.     if(!toDir_.exists())   //如果目录不存在
  5.     {
  6.         if(!toDir_.mkdir(toDir_.absolutePath()))  //如果创建目录失败
  7.             return false;
  8.     }
  9.     QFileInfoList fileInfoList = fromDir.entryInfoList();    //...
  10.     foreach(QFileInfo fileInfo, fileInfoList)
  11.     {
  12.         if(fileInfo.fileName() == "." || fileInfo.fileName() == "..")
  13.             continue;
  14.         if(fileInfo.isDir())  //拷贝子目录
  15.         {
  16.             if(!qCopyDirectory(fileInfo.filePath(), toDir_.filePath(fileInfo.fileName()),filters,bCoverIfFileExists))  //递归调用拷贝
  17.                 return false;
  18.         }
  19.         else  //拷贝子文件
  20.         {
  21.             if(bCoverIfFileExists && toDir_.exists(fileInfo.fileName()))
  22.             {
  23.                 toDir_.remove(fileInfo.fileName());
  24.             }
  25.             if(filters.contains("*"))
  26.             {
  27.                 if(!QFile::copy(fileInfo.filePath(), toDir_.filePath(fileInfo.fileName()))) //文件复制API
  28.                 {
  29.                     return false;
  30.                 }
  31.             }
  32.             else if(filters.contains(fileInfo.completeSuffix()))  //如果包含指定扩展名的文件,则毫不客气——带走!
  33.             {
  34.                 if(!QFile::copy(fileInfo.filePath(), toDir_.filePath(fileInfo.fileName()))) //文件复制API
  35.                 {
  36.                     return false;
  37.                 }
  38.             }
  39.         }
  40.     }
  41.     return true;
  42. }

bye拉,四个月后再见,这些日子每天都是狰狞,坚持,加油 ......
离线stlcours

只看该作者 1楼 发表于: 2016-06-01
实践的态度好,赞一个~!
离线stlcours

只看该作者 2楼 发表于: 2016-06-16
今天又看到这个帖子,不禁感叹,暑假也这么努力呀,不光搞程序,而且还搞高数,小同学有前途!!
快速回复
限100 字节
 
上一个 下一个