• 多格式过滤器


    用迅雷下载文件时间久了 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;
    }
  • 相关阅读:
    [动图演示]Redis 持久化 RDB/AOF 详解与实践
    挑战10个最难的Java面试题(附答案)【上】
    Python使用psutil模块,做你的电脑管家
    在线工具 正则表达式
    [USACO09JAN]Earthquake Damage
    [USACO09MAR]Moon Mooing
    [HNOI2005]汤姆的游戏
    [SDOI2010]大陆争霸
    [USACO08NOV]Cheering up the Cow
    [USACO08NOV]lites
  • 原文地址:https://www.cnblogs.com/hicjiajia/p/2445636.html
Copyright © 2020-2023  润新知