1. 程式人生 > >Qt之使用Everything搜尋資料

Qt之使用Everything搜尋資料

EveryThing

Everything是Windows下一款強大的檔案搜尋工具,若沒有使用過,那下面的內容可以不看了。
作為一個程式設計師,當需要搜尋資料時,自己寫搜尋演算法,這個輪子可能造的有點大,並且可能造不好。everything提供了它的介面,可以方便地整合到我們的程式中,下面就開始吧。
首先貼出everything官網,其中的檔案下載以及sdk都可以檢視:http://www.voidtools.com/

下載相關檔案

1、Everything32.dll、Everything64.dll
2、Everything.h
3、Everything32.lib、Everything64.lib
這些檔案在http://www.voidtools.com/Everything-SDK.zip可以下載。

使用

1、拷貝相關檔案

在工程目錄下建立include目錄,將Everything.h拷入
在工程目錄下建立lib目錄,將Everything32.lib、Everything64.lib拷入
在程式build後,還需要將Everything32.dll、Everything64.dll拷入debug或release目錄,否則程式無法執行。

2、引入檔案

根據程式位數匯入相關lib

INCLUDEPATH += $$PWD/include
LIBS += -L$$PWD/lib -lEverything32

3、定義標頭檔案EveryThingUtil.h

#ifndef
EVERYTHINGUTIL_H
#define EVERYTHINGUTIL_H #include<QList> #include<QString> #include<QFileInfo> #include<QMutex> class EveryThingUtil { public: EveryThingUtil(); //搜尋檔案 static QList<QFileInfo> Search(QString str,bool reg = false); //獲取搜尋錯誤值 static QString getSearchErrorString
(); }; #endif // EVERYTHINGUTIL_H

4、定義cpp檔案EveryThingUtil.cpp

#include "everythingutil.h"
#include<Everything.h>
#include<QDebug>
#include<QDir>
#include<QFileInfo>
EveryThingUtil::EveryThingUtil()
{

}
QList<QFileInfo> EveryThingUtil::Search(QString str, bool reg)
{
    QMutex mutex;
    mutex.lock();
    QList<QFileInfo> files;
    Everything_CleanUp();
    //將搜尋字串
    std::wstring wlpstr = str.toStdWString();
    LPCWSTR lpcwStr = wlpstr.c_str();
    if(reg){
        Everything_SetRegex(TRUE);
    }
    Everything_SetSearch(lpcwStr);
    Everything_SetRequestFlags(EVERYTHING_REQUEST_FILE_NAME | EVERYTHING_REQUEST_PATH);
    //執行查詢。
    BOOL result = Everything_Query(TRUE);
    if(!result){
        qDebug()<<getSearchErrorString();
    }else{
        //獲取所有查詢到檔案
        int results = (int)Everything_GetNumResults();
        for (int var = 0; var < results; ++var) {
            QString name = QString::fromStdWString(Everything_GetResultFileName(var));
            QString path = QDir::toNativeSeparators(QString::fromStdWString(Everything_GetResultPath(var)));
            QFileInfo f(path+QDir::separator()+name);
            files.append(f);
        }
     }
    Everything_Reset();
    mutex.unlock();
    return files;

}
QString EveryThingUtil::getSearchErrorString(){
    DWORD error = Everything_GetLastError();
    QString str;
    if(error == EVERYTHING_ERROR_MEMORY){
        str = "未能為搜尋查詢分配記憶體。";
    }
    if(error == EVERYTHING_ERROR_IPC){
        str = "IPC不可用。";
    }
    if(error == EVERYTHING_ERROR_REGISTERCLASSEX){
        str = "未能註冊搜尋查詢視窗類。";
    }
    if(error == EVERYTHING_ERROR_CREATEWINDOW){
        str = "建立搜尋查詢視窗失敗。";
    }
    if(error == EVERYTHING_ERROR_CREATETHREAD){
        str = "建立搜尋查詢執行緒失敗。";
    }
    if(error == EVERYTHING_ERROR_INVALIDINDEX){
        str = "無效索引。索引必須大於或等於0,小於可見結果的數目。";
    }
    if(error == EVERYTHING_ERROR_INVALIDCALL){
        str = "無效的呼叫。";
    }
    return str;
}

5、使用方法

QList<QFileInfo> fileInfos = EveryThingUtil::Search(regexp,true);

注意

使用時需要啟動everything軟體並且等待其初始化完畢。

若有疑問可以在下方留言,歡迎關注我的公眾號CodingBL。
CodingBL