Qt之使用Everything搜尋資料
阿新 • • 發佈:2018-12-09
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。