2011-01-10 66 views
2

我在寻找如何编写一个多线程C++代码来扫描目录并获取下面所有文件的列表。我写了一个单线程的代码,可以做到这一点,代码可以做到这一点。C++多线程目录扫描代码

#include <sys/types.h> 
#include <dirent.h> 
#include <errno.h> 
#include <vector> 
#include <string> 
#include <iostream> 
#include <sys/stat.h> /* for stat() */ 


using namespace std; 
int isDir(string path) 
; 

/*function... might want it in some class?*/ 
int getdir (string dir, vector<string> &dirlist, vector<string> &fileList) 
{ 
    DIR *dp; 
    struct dirent *dirp, *dirFp ; 
    if((dp = opendir(dir.c_str())) == NULL) { 
     cout << "Error(" << errno << ") opening " << dir << endl; 
     return errno; 
    } 

    while ((dirp = readdir(dp)) != NULL) { 
     if (strcmp (dirp->d_name, ".") != 0 && strcmp(dirp->d_name, "..") != 0) { 
      //dirlist.push_back(string(dirp->d_name)); 

      string Tmp = dir.c_str()+ string("/") + string(dirp->d_name); 
      if(isDir(Tmp)) { 
      //if(isDir(string(dir.c_str() + dirp->d_name))) { 
       dirlist.push_back(Tmp); 
       getdir(Tmp,dirlist,fileList); 
      } else { 
    //    cout << "Files :"<<dirp->d_name << endl; 
       fileList.push_back(string(Tmp)); 
      } 

     } 
    } 
    closedir(dp); 
    return 0; 
} 

int isDir(string path) 
{ 
    struct stat stat_buf; 
    stat(path.c_str(), &stat_buf); 
    int is_dir = S_ISDIR(stat_buf.st_mode); 
// cout <<"isDir :Path "<<path.c_str()<<endl; 
    return (is_dir ? 1: 0); 
} 

int main() 
{ 
    string dir = string("/test1/mfs"); 
    vector<string> dirlist = vector<string>(); 
    vector<string> fileList = vector<string>(); 

    getdir(dir,dirlist,fileList); 
#if 0 
    for (unsigned int i = 0;i < dirlist.size();i++) { 
     cout << "Dir LIst" <<dirlist[i] << endl; 
     //string dirF = dir + "/" + dirlist[i]; 
     //getdir(dirF,fileList); 
    } 
#endif 
    for (unsigned int i = 0; i < fileList.size(); i++) 
     cout << "Files :"<<fileList[i]<< endl; 
    return 0; 
} 

现在的问题是,它是单线程,我需要扫描说约8000目录下文件可以存在。所以我不知道如何去做,因为目录的数量可能会随着N维矩阵而变化。

在这方面的任何帮助将是伟大的。提前致谢。

+1

我不太确定你所指的是什么N维矩阵。但要回答你的问题,你最终必须做一个平行的深度优先搜索。我假设你已经知道如何进行多线程编程;如果没有,那么你需要了解这一点,最好是使用Boost库而不是POSIX线程。 – chrisaycock 2011-01-10 18:01:42

+0

基本上用N维矩阵我想说,假设我们有一个20x20x20的矩阵,那么我将有8000个需要搜索的目录。所以这可以根据需求增加。 – Abhinav 2011-01-10 18:28:52

回答

1

boost :: filesystem有directory_iterator和recursive_directory_iterator,前者将得到一个目录的所有内容但不递归子目录,后者也会递归子目录。

关于线程安全性,您可以锁定互斥锁,然后将结果复制到std :: vector或两个向量实例中,一个用于文件,另一个用于目录,在这种情况下,您至少会拥有本地快照复制。

要实际“冻结”该文件系统以停止修改它的任何进程通常不会执行 - 您可以尝试将其上的文件属性设置为只读,稍后再更改它,但是您需要先获得许可。