Everything是Windows下一款强大的文件搜索工具,若没有使用过,那下面的内容可以不看了。
作为一个程序员,当需要搜索数据时,自己写搜索算法,这个轮子可能造的有点大,并且可能造不好。everything提供了它的接口,可以方便地集成到我们的程序中,下面就开始吧。
首先贴出everything官网,其中的文件下载以及sdk都可以查看:
下载相关文件
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软件并且等待其初始化完毕。