Qt查找文件及文本(备忘备用)

来源:互联网 发布:供应链协同软件 编辑:程序博客网 时间:2024/05/22 04:47
//响应用户“浏览”操作的槽函数browse()
void CFindFileForm::browse(){
    QString dir = QFileDialog::getExistingDirectory(
                this,tr("选择查找路径"),QDir::currentPath(),
                QFileDialog::ShowDirsOnly);
    if(!dir.isEmpty()){
        
        dirComboBox->addItem(dir);
        dirComboBox->setCurrentIndex(dirComboBox->currentIndex()+1);
    }
}
//find()槽函数响应用户单击"查找"操作
void CFindFileForm::find(){
    frame->setEnabled(false);
    findPushBtn->setEnabled(false);
    stopPushBtn->setEnabled(true);
    statusLabel->setText(tr("正在搜索..."));
    resultTableWidget->setRowCount(0);
    
    QString fileName = nameComboBox->currentText(); //查找的文件名
    QString txt = txtLineEdit->text(); //查找的文本(在文件中)
    QString path = dirComboBox->currentText(); //在此文件夹内查找
    m_bSubFolder = subFolderCheckBox->isChecked(); //是否遍历子文件夹
    m_bSensitive = sensitiveCheckBox->isChecked(); //是否区分大小写
    
    m_nCount = 0;
    m_bStoped =false;
    QDir dir = QDir(path);
    if(fileName.isEmpty()) //如果文件名为空,查找所有文件
        fileName = "*";
    tranvFolder(dir,fileName,txt); //实现真正的查找文件功能
    if(m_bStoped)
        statusLabel->setText(tr("已中止"));
    else
        statusLabel->setText(tr("就绪")); //及其后面:查找结束重置以便下次查找
    findPushBtn->setEnabled(true); 
    stopPushBtn->setEnabled(false);
    frame->setEnabled(true);    
}
//真正的查找文件
void CFindFileForm::tranvFolder(const QDir&dir,
                                const QString&fileName,
                                const QString& txt){
    if(m_bSubFolder){       //如果查找子文件夹,递归查找
        
        QStringList folders;
        //获取当前文件夹下的所有子文件夹列表
        floders = dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot);
        for(int i = 0; i < folders.size(); ++i){
            
            qApp->processEvents(); //以便程序在查找过程中可以响应用户的其他操作
            if(m_bStoped)
                break;
            QString strDir = 
                    QString("%1/%2").arg(dir.absolutePath())
                                    .arg(folders[i]);
            tranvFolder(strDir,fileName,txt);            
        }
    }
    QStringList files = findFiles(dir,fileName,txt); //当前目录下查找文件
    showFiles(dir,files); //显示文件
    m_nCount += files.size();
    resultLabel->setText(tr("找到%1个文件").arg(m_nCount));
}
//对当前目录的文件查找,并返回查找到的文件列表
QStringList CFindFileForm::findFiles(const QDir &dir,
                                     const QString &fileName,
                                     const QString &txt){
    QStringList files = dir.entryList(QStringList(fileName), //文件名字过滤器
                                      QDir::Files | QDir::NoSymLinks);
    if(txt.isEmpty()) //若没有查找文本,直接返回文件名即可,不必进入文件
        return files;
    QStringList foundFiles; //存放找到的文件名
    Qt::CaseSensitivity sensitive = Qt::CaseInsensitive;
    if(m_bSensitive) //是否区分大小写
        sensitive = Qt::CaseSensitive;
    for(int i = 0; i < files.size(); ++i){
        
        qApp->processEvents();
        if(m_bStoped) //查找中止
            break;
        QFile file(dir.absoluteFilePath(files[i])); //取绝对文件路径
        if(file.open(QIODevice::ReadOnly)){ //只读方式打开文件
            
            QString line;    //存放一行文本
            QTextStream in(&file); //文本流
            while(!in.atEnd()){ //还没读到文件尾循环
                
                if(m_bStoped)
                    break;
                line = in.readLine(); //文本流对象读一行文本
                if(line.contains(txt,sensitive)){ //这一行中包含有要找的文本
                    
                    foundFiles<<files[i]; //加入到找到的文件列表中
                    break;  //找到文本,终止对此文件的查找
                }
            }
        }
        
    }
    return foundFiles;
}
//显示查找到的文件名
void CFindFileForm::showFiles(const QDir& dir,const QStringList &files){
    
    for(int i = 0; i < files.size(); ++i){
        
        QString strFilePath = dir.absoluteFilePath(files[i]); //取绝对路径
        QFile file(strFilePath);
        QFileInfo fileInfo(file); //文件信息对象
        qint64 size = fileInfo.size(); //文件大小
        QDateTime dateTime = fileInfo.created(); //文件创建时间        
        QString strDataTime = dateTime.toString(tr("yyyy MM月dd日hh::mm"));
        QString strPermission;  //文件权限
        if(fileInfo.isWriteable()) //文件可读
            strPermission = ("w");
        if(fileInfo.isReadabled())
            strPermission.append(" r");
        if(fileInfo.isExecutable)
            strPermission.append(" x");
        
        QTableWidgetTtem *fileNameItem =
                new QTableWidgetItem(strFilePath);
        fileNameItem->setFlags(Qt::ItemIsEnabled);
        QTableWidgetItem* sizeItem = new QTableWidgetItem(tr("%1 KB")
                                                          .arg(int((size+1023)/1024)));
        sizeItem->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter);
        sizeItem->setFlags(Qt::ItemIsEnabled);
        QTableWidgetItem* createdItem = new QTableWidgetItem(strDataTime);
        QTableWidgetItem* permissionItem = new QTableWigetItem(strPermission);
        
        int row = resultTableWidget->rowCount();
        resultTableWidget->insertRow(row);
        resultTableWidget->setItem(row,0,fileNameItem);
        resultTableWidget->setItem(row,1,sizeItem);
        resultTableWidget->setItem(row,2,createdItem);
        resultTableWidget->setItem(row,3,permissionItem);
    }
}
//槽函数stop()响应用户单击“停止”按钮操作
void CFindFileForm::stop(){
    
    m_bStoped = true;
}
//槽函数doTxtChanged()响应“包含文本”LineEdit的编辑操作
void CFindFileForm::doTxtChanged(const QString& txt){
    
    if(txt.isEmpty()) //若文本为空,大小写复选框不可用
        sensitiveCheckBox->setEnabled(false);
    eles 
        sensitiveCheckBox->setEnabled(true);
}

0 0
原创粉丝点击