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软件并且等待其初始化完毕。