在C中抓取递归ntfs目录的最快方法

我写了一个小的爬虫来扫描和求助目录结构.

它基于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 += testPrintDir(strFullName,strPattern,recurse);
        }
      }
    }
    closedir (dir);
    return retVal;
  } else {
    /* Could not open directory */
    perror ("DIR NOT FOUND!");
    return -1;
  }
}

解决方法

在某些情况下,这样的速度是正常的.首先,使用FindFirstFileA而不是FindFirstFileW将导致从UTF-16到ANSI的转换开销.其次,如果您要浏览操作系统尚未访问的目录,则会产生至少一次查找惩罚(大多数消费者硬盘大约需要16毫秒),将枚举限制在每秒100次以下的目录检查中.如果给定驱动器上的主文件表严重碎片,这将变得更糟.

关于文件数量,它将更多地取决于每个目录的文件数量而不是文件本身的数量.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...