2011-01-10 78 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或兩個向量實例中,一個用於文件,另一個用於目錄,在這種情況下,您至少會擁有本地快照複製。

要實際「凍結」該文件系統以停止修改它的任何進程通常不會執行 - 您可以嘗試將其上的文件屬性設置爲只讀,稍後再更改它,但是您需要先獲得許可。