我写了一个小的爬虫来扫描和求助目录结构.
它基于dirent(这是FindNextFileA的一个小包装)在我的第一个基准测试中,它是惊人的缓慢:
4500个文件大约123473ms(thinkpad t60p本地三星320 GB 2.5"HD).在123473毫秒找到121481个文件这个速度是否正常?
这是我的代码:
int testPrintDir(std::string strDir, std::string strPattern="*", bool recurse=true){
struct dirent *ent;
DIR *dir;
dir = opendir (strDir.c_str());
int retVal = 0;
if (dir != NULL) {
while ((ent = readdir (dir)) != NULL) {
if (strcmp(ent->d_name, ".") !=0 && strcmp(ent->d_name, "..") !=0){
std::string strFullName = strDir +"\\"+std::string(ent->d_name);
std::string strType = "N/A";
bool isDir = (ent->data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) !=0;
strType = (isDir)?"DIR":"FILE";
if ((!isDir)){
//printf ("%s <%s>\n", strFullName.c_str(),strType.c_str());//ent->d_name);
retVal++;
}
if (isDir && recurse){
retVal …Run Code Online (Sandbox Code Playgroud) 我正在编写一个工具,可以找到适用于Mac和Windows的iTunes资料库的丢失文件.在Mac上,我可以通过使用精彩的"CatalogSearch"功能命名来快速查找文件.
但是,在Windows上,似乎没有用于按文件名搜索的OS API(或者是否存在?).
经过一些谷歌搜索,我了解到有一些工具(如TFind,Everything)直接读取NTFS目录并扫描它以按名称查找文件.
我想做同样的事情,但不必从头开始(虽然我过去写了很多磁盘工具,但我从来没有精力去挖掘NTFS).
我想知道是否有现成的库,可能是.dll,它会给我这个搜索功能:传入一个文件名,回到它的路径.
或者,Windows索引服务怎么样?至少当我在最近安装的XP Home系统上尝试此操作时," 开始"菜单下的" 搜索"操作实际上会扫描所有目录,这表明它没有完整的数据库.由于我根本不是Windows用户,我想知道为什么这不起作用.
最后,我需要的完整解决方案是:我有一个要查找的文件名列表,我需要搜索整个磁盘的代码(或者使用数据库)来一次性获取所有结果.例如,搜索不应该为我正在查找的每个文件启动新的完整扫描.这就是为什么我认为MFT方式是最优的,因为它可以快速迭代所有名称,将每个名称与我的列表进行比较.