多格式过滤器

用迅雷下载文件时间久了 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;
}
原文地址:https://www.cnblogs.com/hicjiajia/p/2445636.html