全盘遍历文件,速度如何才能快

yystudent 2018-09-10 04:01:08
目前全盘遍历文件,采用递归方法,速度很慢,特别是电脑文件很多的时候,大家有什么好办法可以处理,请教各位高手!
...全文
766 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2018-09-17
  • 打赏
  • 举报
回复
引用 17 楼 dahaiI0 的回复:
[quote=引用 7 楼 zhao4zhong1 的回复:]
我的方法比everything快100倍!不管你们信不信。
我的硬盘上共2768924个文件,给定文件名中某几个字符找到符合条件的文件只需0.1秒!

不说前提条件的都是耍流氓,光获取文件列表就至少要几秒,如果说有缓存,那匹配个文件最多只需要几十毫秒。[/quote]
关键是何时更新缓存。
hongwenjun 2018-09-15
  • 打赏
  • 举报
回复
http://www.voidtools.com/support/everything/command_line_interface/
hongwenjun 2018-09-15
  • 打赏
  • 举报
回复
引用 8 楼 Slzde_sub 的回复:
[quote=引用 7 楼 zhao4zhong1 的回复:] 我的方法比everything快100倍!不管你们信不信。 我的硬盘上共2768924个文件,给定文件名中某几个字符找到符合条件的文件只需0.1秒!
zls 有自信 [/quote] 不太相信,你这个和硬盘和系统缓存硬盘文件系统结构有关系,第一次读没有缓存,速度不快的
// 请输入搜索信息关键字,调用Everything搜索文件
    string es_cmd;
    getline(std::cin , es_cmd);

    char es_exe_file[MAX_PATH] = {0};
    strcpy(es_exe_file, app_path);
    strcat(es_exe_file, "\\es.exe ");

    es_cmd = string(es_exe_file) + " " + es_cmd + " > filelist.txt";
    
     int es_err = system(es_cmd.c_str());
    if (es_err == 0) {
    
    // 处理  filelist.txt
    }
安装 Everything 后再下载 es.exe 着命令行版本,再程序调动
赵4老师 2018-09-15
  • 打赏
  • 举报
回复
引用 8 楼 Slzde_sub 的回复:
[quote=引用 7 楼 zhao4zhong1 的回复:] 我的方法比everything快100倍!不管你们信不信。 我的硬盘上共2768924个文件,给定文件名中某几个字符找到符合条件的文件只需0.1秒!
zls 有自信 [/quote] 楼上引用错楼层了。
赵4老师 2018-09-15
  • 打赏
  • 举报
回复
引用 9 楼 imslf 的回复:
1.shell命令 2.硬盘都有分区,分区遍历
不然我的签名也不会是 “百万军中取上将首级如探囊取物,千万行里改关键源码在弹指瞬间。” 了。
dahaiI0 2018-09-15
  • 打赏
  • 举报
回复
引用 7 楼 zhao4zhong1 的回复:
我的方法比everything快100倍!不管你们信不信。
我的硬盘上共2768924个文件,给定文件名中某几个字符找到符合条件的文件只需0.1秒!

不说前提条件的都是耍流氓,光获取文件列表就至少要几秒,如果说有缓存,那匹配个文件最多只需要几十毫秒。
dahaiI0 2018-09-15
  • 打赏
  • 举报
回复
比较简单的是通过deviceiocontrol+FSCTL_ENUM_USN_DATA来枚举每个盘的文件。如果还想更快,就只能解析MFT文件了,不过这个比较复杂,具体效果的话可以体验下腾讯桌面整理里的搜索,everything新版本使用的也是这种方法。
Ruoch 2018-09-15
  • 打赏
  • 举报
回复
用cmd获取路径 建立文件路径库
ForestDB 2018-09-14
  • 打赏
  • 举报
回复
这得看你是遍历元数据还是内容。
imslf 2018-09-12
  • 打赏
  • 举报
回复
1.shell命令
2.硬盘都有分区,分区遍历
赵4老师 2018-09-12
  • 打赏
  • 举报
回复
我的方法比everything快100倍!不管你们信不信。
我的硬盘上共2768924个文件,给定文件名中某几个字符找到符合条件的文件只需0.1秒!
赵4老师 2018-09-11
  • 打赏
  • 举报
回复
system("dir /b /a-d c:\\*.* >d:\\allfiles.txt");
//读文件d:\\allfiles.txt的内容即C:\\下所有文件的名字
system("dir /b /a-d /s c:\\*.* >d:\\allfilesinsub.txt");
//读文件d:\\allfilesinsub.txt的内容即C:\\下所有文件的名字包含子目录
system("dir /b /ad c:\\*.* >d:\\alldirs.txt");
//读文件d:\\alldirs.txt的内容即C:\\下所有子目录的名字
请记住,能用shell命令获取文件、文件夹信息或者操作文件、文件夹最好用shell命令获取或者操作,而不要用各种API获取或者操作,因为当遇到非法文件夹名或非法文件名或非法文件长度、非法文件日期、压缩文件、链接文件、稀疏文件……等各种意料之外的情况时,API会处理的不全面或陷入死循环,而shell命令不会。
如果嫌system黑窗口一闪,将system("...")替换为WinExec("cmd /c ...",SW_HIDE);
#include "stdafx.h"
using namespace std;
struct {
UINT type; LPCSTR name;
} DriveTypeFlags [] = {// GetDriveType返回码与人可读字符串对照表
{DRIVE_UNKNOWN ,"未知" },
{DRIVE_NO_ROOT_DIR ,"无效路经" },
{DRIVE_REMOVABLE ,"可移动" },
{DRIVE_FIXED ,"固定" },
{DRIVE_REMOTE ,"网络驱动器" },
{DRIVE_CDROM ,"CD-ROM" },
{DRIVE_RAMDISK ,"随机存取磁盘"},
{0 , NULL },
};
int _tmain() {
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0)) {
cerr << _T("Fatal Error: MFC initialization failed") << endl;
return -1;
}

// 获取逻辑驱动器字符串- a:\<null>b:\<null>c:\<null>...z:\<null><null>
// 还可以用GetLogicalDrives以位图形式代替字符串形式获取信息
TCHAR buf[200];
DWORD len = GetLogicalDriveStrings(sizeof(buf)/sizeof(TCHAR),buf);

string msg = "逻辑驱动器:\n";
for (TCHAR* s=buf; *s; s+=_tcslen(s)+1) {
LPCTSTR sDrivePath = s;
msg += sDrivePath;
msg += " ";
UINT uDriveType = GetDriveType(sDrivePath);
for (int i=0; DriveTypeFlags[i].name; i++) {
if (uDriveType == DriveTypeFlags[i].type) {
msg += DriveTypeFlags[i].name;
break;//
}
}
msg += '\n';
}
cout << msg.c_str();
return 0;
}
zhongchengli 2018-09-11
  • 打赏
  • 举报
回复
C++ USN日志 相关的代码 http://zuoqiang.iteye.com/blog/1181641
AlbertS 2018-09-11
  • 打赏
  • 举报
回复
引用 1 楼 NexTor 的回复:
可以参考everything软件的实现原理https://www.cnblogs.com/xust/articles/3616940.html
解析USN日志或是自己维护文件索引表

感谢分享
smwhotjay 2018-09-10
  • 打赏
  • 举报
回复

快照,缓存列表
ztenv 版主 2018-09-10
  • 打赏
  • 举报
回复
everything是很快的,可以参考
NexTor 2018-09-10
  • 打赏
  • 举报
回复
可以参考everything软件的实现原理https://www.cnblogs.com/xust/articles/3616940.html
解析USN日志或是自己维护文件索引表

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧