Qt“find”或“locate”命令在QProcess

时间:2018-02-12 13:23:33

标签: c++ bash qt

我想写一个简单的应用程序,搜索整个系统的文件和文件夹。 但是,应用程序无法按预期工作,只能查找位于/ opt /和/ home中的某些文件。我希望能够搜索任何文件,无论显示它需要多大的缓冲区。 我正在更新textEdit内容后调用此函数:

void FileSearch::fileSearch (QString needle)
{
    QProcess file_search_process;
    QString exec = "/usr/bin/find";
    QStringList params;
     params << "/" << "-name" << "*"+needle+"*";
    file_search_process.start(exec,params);
    file_search_process.waitForFinished();
    QByteArray newData=file_search_process.readAll();
    this->result = QString::fromLocal8Bit(newData);
    //std::cout << this->result.toUtf8().constData() << std::endl;
}

此外,虽然在单独的终端中我确认存在某些匹配,但有时没有显示任何内容。我也试过了"locate" << QStringList() << needle。另外,我发现它不是由于root权限(我仍然以root身份运行我的应用程序),不知道还有什么可以尝试。

我怀疑这可能是因为Qt应用程序如何处理这个过程。任何帮助都非常感激。

编辑:以下对我来说很好,虽然它实际上并没有解决其他需要使用查找或定位的人的问题:

void FileSearch::fileSearch (QString needle)
{
    QDirIterator dirIt("/",QDirIterator::Subdirectories);
    while (dirIt.hasNext()) {
        dirIt.next();
        if (QFileInfo(dirIt.filePath()).isFile())
            if(dirIt.filePath().contains(needle, Qt::CaseSensitive))
                qDebug()<<dirIt.filePath();
    }
}

1 个答案:

答案 0 :(得分:0)

使用默认> CREATE TABLE t(x INTEGER CHECK (typeof(x) = 'integer')); > EXPLAIN INSERT INTO t VALUES('42'); addr opcode p1 p2 p3 p4 p5 comment ---- ------------- ---- ---- ---- ------------- -- ------------- 0 Init 0 11 0 00 Start at 11 1 OpenWrite 0 2 0 1 00 root=2 iDb=0; t 2 NewRowid 0 1 0 00 r[1]=rowid 3 String8 0 2 0 42 00 r[2]='42' 4 Copy 2 4 0 00 r[4]=r[2] 5 PureFunc0 0 4 3 typeof(1) 01 6 Eq 5 8 3 51 if r[3]==r[5] goto 8 7 Halt 275 2 0 t 03 8 MakeRecord 2 1 3 D 00 r[3]=mkrec(r[2]) 9 Insert 0 3 1 t 39 intkey=r[1] data=r[3] 10 Halt 0 0 0 00 11 Transaction 0 1 1 0 01 usesStmtJournal=0 12 String8 0 5 0 integer 00 r[5]='integer' 13 Goto 0 1 0 00 值,

QProcess::waitForFinished在30秒后超时。显然,当进程msecs仍在运行时,您的QProcess实例会被销毁,并且您只获得部分结果或根本没有结果。 如果msecs为-1 ,则该函数不会超时。

我更喜欢使用/usr/bin/find方法,该方法接受包含程序名称及其参数的单个文本字符串。通过这种方式,您可以更轻松地查看传递给QProcess的内容。

QProcess::start