NTFS 文件搜索库
NTFS 文件搜索库
中文 | English
一个快速搜索NTFS卷文件的库
在这里插入图片描述


特性
- 快速扫描 NTFS 格式驱动器上的所有文件
- 实时快速同步文件变更(创建, 更名, 删除)
- 支持通配符查询文件名或文件路径
- 重启自动更新文件变动, 无需重新进行全盘扫描
API描述
-
初始化并指定你关注的驱动器
// // @brief: 初始化(驱动器掩码) // @param: dwDriveIndexMask 驱动器索引掩码(位组合: C: 0x01 D: 0x02 E: 0x04...) // @param: strDbPath 数据库文件路径 // @param: fRebuildDb 是否重建数据库 // @ret: BOOL 操作是否成功 BOOL NTFS_Search_Initialize_By_Drive_Mask(DWORD dwDriveIndexMask, LPCTSTR lpDbPath,bool fRebuildDb );// // @brief: 初始化(驱动器盘符) // @param: strDriveList 驱动器列表, 如: "ABCDEFGHIJKLMNOPQRSTUVWXYZ" // @param: strDbPath 数据库文件路径 // @param: fRebuildDb 是否重建数据库 // @ret: BOOL 操作是否成功 BOOL NTFS_Search_Initialize_By_Drive_Letter(LPCTSTR lpDriveList,LPCTSTR lpDbPath,bool fRebuildDb ); -
重置并指定你关注的驱动器
// // @brief: 重置(驱动器掩码) // @param: dwDriveIndexMask 驱动器索引掩码(位组合: C: 0x01 D: 0x02 E: 0x04...) // @param: strDbPath 数据库文件路径 // @param: fRebuildDb 是否重建数据库 // @ret: BOOL 操作是否成功 NTFSSEARCH_API BOOL NTFS_Search_Reset_By_Drive_Mask(DWORD dwDriveIndexMask,LPCTSTR lpDbPath,bool fRebuildDb );// // @brief: 重置(驱动器盘符) // @param: strDriveList 驱动器列表, 如: "ABCDEFGHIJKLMNOPQRSTUVWXYZ" // @param: strDbPath 数据库文件路径 // @param: fRebuildDb 是否重建数据库 // @ret: BOOL 操作是否成功 NTFSSEARCH_API BOOL NTFS_Search_Reset_By_Drive_Letter(LPCTSTR lpDriveList,LPCTSTR lpDbPath,bool fRebuildDb ); -
获取当前文件总数
// // @brief: 获取当前文件总数 // @ret: LONGLONG 当前文件总数 NTFSSEARCH_API LONGLONG NTFS_Search_GetCount(); -
查询文件, 支持通配符(* 匹配 0 个或多个字符 ? 匹配 1 个字符)
// // @brief: 查询文件路径 // @param: lpKeyword 关键字, 如: "C:\*.zip" // @param: cb 查询回调函数(返回FALSE终止结果枚举) // @param: lpData 回调函数附加参数 // @ret: BOOL 操作是否成功 NTFSSEARCH_API BOOL NTFS_Search_Query(LPCTSTR lpKeyword,NtfsSearchCallback cb,LPVOID lpData ); -
反初始化
// // @brief: 反初始化 // @ret: void 操作是否成功 NTFSSEARCH_API VOID NTFS_Search_Uninitialize();
性能描述
-
拥有较好的性能
- 全盘扫描 77 万文件耗时约 13秒
- 搜索 * 耗时 1.3秒
- 搜索 *.zip 耗时 0.2秒
-
内存占用小
- 77 万 文件数内存占用仅 100MB 左右
-
数据库文件占用
- 77 万 文件数据库存储占用 300+ MB 磁盘空间
使用例子
#include <windows.h>
#include <tchar.h>
#include <locale>
#include <string>
#include <vector>
#include "../NTFS_Search_Lib/include/NTFS_Search_Api.h"#ifdef _UNICODE
using _tstring = std::wstring;
#else
using _tstring = std::string;
#endif#ifndef _DEBUG#ifdef _UNICODE#ifdef _WIN64
#pragma comment(lib, "../NTFS_Search_lib/lib/NTFS_Search_Lib_x64_W.lib")
#else
#pragma comment(lib, "../NTFS_Search_lib/lib/NTFS_Search_Lib_x86_W.lib")
#endif#else#ifdef _WIN64
#pragma comment(lib, "../NTFS_Search_lib/lib/NTFS_Search_Lib_x64_A.lib")
#else
#pragma comment(lib, "../NTFS_Search_lib/lib/NTFS_Search_Lib_x86_A.lib")
#endif#endif#else
#ifdef _UNICODE#ifdef _WIN64
#pragma comment(lib, "../NTFS_Search_lib/lib/NTFS_Search_Lib_x64_WD.lib")
#else
#pragma comment(lib, "../NTFS_Search_lib/lib/NTFS_Search_Lib_x86_WD.lib")
#endif#else#ifdef _WIN64
#pragma comment(lib, "../NTFS_Search_lib/lib/NTFS_Search_Lib_x64_AD.lib")
#else
#pragma comment(lib, "../NTFS_Search_lib/lib/NTFS_Search_Lib_x86_AD.lib")
#endif#endif#endifstd::wstring _MultiStrToWStr(UINT CodePage, const std::string& str)
{int cchWideChar = ::MultiByteToWideChar(CodePage, 0, str.c_str(), -1, NULL, 0);std::wstring strResult(cchWideChar, 0);size_t nConverted = ::MultiByteToWideChar(CodePage, 0, str.c_str(), (int)str.size(), &strResult[0], (int)strResult.size());strResult.resize(nConverted);return strResult;
}_tstring AStrToTStr(const std::string& str)
{
#ifdef _UNICODEreturn _MultiStrToWStr(CP_ACP, str);
#elsereturn str;
#endif
}int _tmain(int argc, LPCTSTR argv[])
{setlocale(LC_ALL, "");clock_t tmBegin = ::clock();clock_t tmEnd = ::clock();_tstring strDriveList = _T("");_tstring strDbPath = _T("");// 初始化NTFS_Search_Initialize_By_Drive_Letter(strDriveList.c_str(), strDbPath.c_str(), false);if (0 == NTFS_Search_GetCount()){_tprintf(_T("扫描指定驱动器: %s\n"), strDriveList.c_str());tmBegin = ::clock();NTFS_Search_Reset_By_Drive_Letter(strDriveList.c_str(), strDbPath.c_str(), true);tmEnd = ::clock();_tprintf(_T("扫描耗时: %d毫秒\n"), tmEnd - tmBegin);}_tstring strKey;while (true){char szBuf[MAX_PATH] = { 0 };_tprintf(_T("文件数: %llu\n"), NTFS_Search_GetCount());_tprintf(_T("命令: \n"));_tprintf(_T(" :r 重新扫描, 如: :r\n"));_tprintf(_T(" :: 重新扫描指定驱动器, 如: ::CDEF\n"));_tprintf(_T(" :q 退出, 如: :q\n"));_tprintf(_T("查找关键字: "));strKey.clear();while (strKey.empty()){gets_s(szBuf, sizeof(szBuf));strKey = AStrToTStr(szBuf);}if (0 == _strnicmp(szBuf, "::", 2)){strDriveList = strKey.substr(2);_tprintf(_T("重新扫描指定驱动器: %s\n"), strDriveList.c_str());tmBegin = ::clock();NTFS_Search_Reset_By_Drive_Letter(strDriveList.c_str(), strDbPath.c_str(), true);tmEnd = ::clock();_tprintf(_T("总共耗时: %d毫秒\n"), tmEnd - tmBegin);continue;}if (0 == _stricmp(szBuf, ":r")){_tprintf(_T("重新扫描\n"));tmBegin = ::clock();NTFS_Search_Reset_By_Drive_Letter(strDriveList.c_str(), strDbPath.c_str(), true);tmEnd = ::clock();_tprintf(_T("总共耗时: %d毫秒\n"), tmEnd - tmBegin);continue;}if (0 == _stricmp(szBuf, ":q")){_tprintf(_T("退出\n"));break;}_tprintf(_T(R"(查询中...)"));_tprintf(_T("\n"));std::vector<_tstring> fileList;tmBegin = ::clock();int nRes = NTFS_Search_Query(strKey.c_str(), [](LPVOID lpData, LPCTSTR lpPath) -> bool {std::vector<_tstring>* pList = (std::vector<_tstring>*)lpData;pList->push_back(lpPath);return true;},&fileList);tmEnd = ::clock();int nIndex = 0;for (const auto& item : fileList){_tprintf(_T("%d: %s\r\n"), ++nIndex, item.c_str());if (nIndex >= 100){break;}}_tprintf(_T("\n"));_tprintf(_T("耗时: %g秒 查找结果: %d \n"), (double)((tmEnd - tmBegin)) / 1000.0f, (int)fileList.size());}NTFS_Search_Uninitialize();return 0;
};
动态库 & 静态库
https://gitee.com/flame_cyclone/ntfs_search
相关文章:
NTFS 文件搜索库
NTFS 文件搜索库 中文 | English 一个快速搜索NTFS卷文件的库 在这里插入图片描述 特性 快速扫描 NTFS 格式驱动器上的所有文件实时快速同步文件变更(创建, 更名, 删除)支持通配符查询文件名或文件路径重启自动更新文件变动, 无需重新进行全盘扫描 API描述 初始化并指定…...
【GoF23种设计模式】02_单例模式(Singleton Pattern)
文章目录 前言一、什么是单例模式?二、为什么要用单例模式?三、如何实现单例模式?总结 前言 提示:设计者模式有利于提高开发者的编程效率和代码质量: GoF(Gang of Four,四人帮)设计…...
UniApp:uni-segmented-control 自定义布局
自定义tabs选项,items 为tabs名称数组,横向滚动 <scroll-view scroll-x><view class"segmented-control"><view v-for"(item, index) in items" :key"index" class"control-item ":class"…...
【算法day17-day18】回溯:解决组合问题
不好意思呀各位,最近在忙期末考今天才彻底结束,来让我们继续算法之路吧~ 题目引用 组合电话号码的字母组合组合总和组合总和II分割回文串 1.组合 给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回…...
从监控异常发现网络安全
前言 最近在前端异常监控系统中,发现一些异常信息,从中做了一些分析,得到一些体会,因此作文。 发现异常 某天早上打开监控系统发现,当天凌晨1点过测试环境有2个前端上报的异常,报错的原因都是由于没有获取…...
Qt之自定义标题栏拓展(十)
Qt开发 系列文章 - user-defined-titlebars(十) 目录 前言 一、方式一 1.效果演示 2.创建标题栏类 3.可视化UI设计 4.定义相关函数 5.使用标题栏类 二、方式二 1.效果演示 2.创建标题栏类 3.定义相关函数 1.初始化函数 2.功能函数 3.窗口关…...
Verilog中initial的用法
在 Verilog 语言中,initial 语句用于在仿真开始时执行一次性初始化操作。它是顺序执行的,用来描述在仿真启动时立即运行的代码块,通常用于赋初值、生成波形或控制信号行为。 语法 initial begin // 语句1 // 语句2 ... end特点 只…...
(14)D-FINE网络,爆锤yolo系列
yolo过时了?传统的yolo算法在小目标检测方面总是不行,最新算法DEIM爆锤yolo,已经替yolo解决。 一、创新点 这个算法名为DEIM,全称是DETR with Improved Matching for Fast Convergence,其主要创新点在于提出了一…...
Python :冬至快乐
第1部分:基础设置 首先创建一个新的 Python 文件,命名为 fireworks.py。 步骤 1.1: 导入必要的库 import pygame import random import sys from pygame.locals import * import math import time这些库的作用: pygame: 用于创建游戏和图…...
重拾设计模式--状态模式
文章目录 状态模式(State Pattern)概述状态模式UML图作用:状态模式的结构环境(Context)类:抽象状态(State)类:具体状态(Concrete State)类&#x…...
稀疏矩阵的存储与计算 gaxpy
1, gaxpy 数学公式 其中: , , 2, 具体实例 3,用稠密矩阵的方法 本节将用于验证第4节中的稀疏计算的结果 hello_gaxpy_dense.cpp #include <stdio.h> #include <stdlib.h>struct Matrix_SP {float* val; //…...
基于LabVIEW的USRP信道测量开发
随着无线通信技术的不断发展,基于软件无线电的设备(如USRP)在信道测量、无线通信测试等领域扮演着重要角色。通过LabVIEW与USRP的结合,开发者可以实现信号生成、接收及信道估计等功能。尽管LabVIEW提供了丰富的信号处理工具和图形…...
基于LSTM长短期记忆神经网络的多分类预测【MATLAB】
在深度学习中,长短期记忆网络(LSTM, Long Short-Term Memory)是一种强大的循环神经网络(RNN)变体,专门为解决序列数据中的长距离依赖问题而设计。LSTM因其强大的记忆能力,广泛应用于自然语言处理…...
物联网:全面概述、架构、应用、仿真工具、挑战和未来方向
中文论文标题:物联网:全面概述、架构、应用、仿真工具、挑战和未来方向 英文论文标题:Internet of Things: a comprehensive overview, architectures, applications, simulation tools, challenges and future directions 作者信息&#x…...
volatility2工具的使用vol2工具篇
vol2工具 命令格式:vol.py -f [image] --profile[profile] [plugin] 1、查看系统的操作版本,系统镜像信息 2.查看用户名密码信息,当前操作系统中的password hash,例如SAM文件内容 3.从注册表提取LSA密钥信息(已解密&…...
R 基础运算
R 基础运算 R 是一种广泛使用的统计编程语言,它提供了强大的数据操作和分析功能。基础运算在 R 中非常重要,因为它们是进行更复杂计算和数据分析的基础。本文将详细介绍 R 中的基础运算,包括算术运算、逻辑运算、向量化和矩阵运算。 一、算…...
javaScriptBOM
1.1、BOM概述 1.1.1、BOM简介 BOM(browser Object)即浏览器对象模型,它提供了独立于内容而与浏览器窗口进行交互的对象,其核心对象是window。 BOM由一系列的对象构成,并且每个对象都提供了很多方法与属性 BOM缺乏标准…...
Godot RPG 游戏开发指南
Godot RPG 游戏开发指南 一、基础准备 1. 开发环境 下载并安装最新版 Godot 4.x选择使用 GDScript 或 C# 作为开发语言准备基础美术资源(角色、地图、道具等) 2. 项目结构 project/ ├── scenes/ # 场景文件 ├── scripts/ # 脚…...
目标检测数据集图片及标签同步旋转角度
前言 在深度学习领域,尤其是目标检测任务中,数据集的质量直接影响模型的性能。为了提升模型的鲁棒性和对各种场景的适应能力,数据增强技术被广泛应用于图像数据集处理。旋转角度是常见的数据增强方法,通过对图像及其对应的标签&am…...
2025前端面试热门题目——计算机网络篇
计算机网络篇——面试 1. 到底什么是 TCP 连接? TCP 连接的定义 TCP(传输控制协议)是一个面向连接的传输层协议。TCP 连接是通过 三次握手 确立的可靠数据通信链路,保证了在不可靠网络(如互联网)上的数据传输的准确…...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...
日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...
linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...
(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...
【2025年】解决Burpsuite抓不到https包的问题
环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...
2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...
力扣-35.搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...
MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...
MySQL 8.0 事务全面讲解
以下是一个结合两次回答的 MySQL 8.0 事务全面讲解,涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容,并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念(ACID) 事务是…...
