2010-10-02 155 views
0

好吧,所以我試圖得到一個文件夾和子文件夾的目錄,但它只是進入一個無限循環。什麼是創建文件夾和子文件夾目錄的更好方法?因爲我真的不知道。如何從根文件夾及其所有子文件夾生成目錄樹?

這是我到目前爲止的代碼:

#include <sys/types.h> 
#include <sys/stat.h> 
#include <dirent.h> 
#include <errno.h> 
#include <vector> 
#include <string> 
#include <iostream> 

using namespace std; 

struct Directory{ 
    public: 
     int indent; 
     vector<string> files; 
     vector<string> folders; 
     string dir; 
     Directory(string mydir){ dir = mydir;} 
}; 

int getfolders (string dir, vector<string> &folders) 
{ 
    DIR *dp; 
    struct stat st; 
    struct dirent *dirp; 
    if((dp = opendir(dir.c_str())) == NULL) { 
     cout << "Error(" << errno << ") opening " << dir << endl; 
     return errno; 
    } 

    while ((dirp = readdir(dp)) != NULL) { 
     stat(dirp->d_name, &st); 

     if(S_ISDIR(st.st_mode)){ 
      if(dirp->d_name[0] != '.') 
       folders.push_back(string(dirp->d_name)); 
     } 
    } 
    closedir(dp); 
    return 0; 
} 

/*function... might want it in some class?*/ 
int getfiles (string dir, vector<string> &files) 
{ 

    DIR *dp; 
    struct stat st; 
    struct dirent *dirp; 
    if((dp = opendir(dir.c_str())) == NULL) { 
     cout << "Error(" << errno << ") opening " << dir << endl; 
     return errno; 
    } 

    while ((dirp = readdir(dp)) != NULL) { 
     stat(dirp->d_name, &st); 

     if(!S_ISDIR(st.st_mode)){ 
      files.push_back(string(dirp->d_name)); 
     } 
    } 
    closedir(dp); 
    return 0; 
} 

int main() 
{ 
    struct Directory root = Directory("."); 


    vector<string> display = vector<string>(); 

    cout << "hello\n"; 

    getfiles(root.dir,root.files); 
    getfolders(root.dir,root.folders); 

    cout << "hello\n"; 

    vector<Directory> dirs = vector<Directory>(); 

    for(int i = 0; i < (int) root.folders.size(); i++){ 
     dirs.push_back(Directory(root.folders[i])); 

     getfiles(dirs[i].dir,dirs[i].files); 
     getfolders(dirs[i].dir,dirs[i].folders); 


     //infinate loop start 
     for(int j = 0; j < (int) dirs[i].folders.size(); j++){ 
      dirs.push_back(Directory(dirs[i].folders[j])); 

      getfiles(dirs[i].dir,dirs[i].files); 
      getfolders(dirs[i].dir,dirs[i].folders); 
     } 
     //infinate loop end 
    } 

    cout << "hello\n"; 

    for (int i = 0; i < (int) root.folders.size();i++) { 
     cout << root.folders[i] << endl; 
     for(int j = 0; j < (int) dirs[i].folders.size(); j++){ 
      cout << dirs[i].folders[j] << endl; 
     } 
    } 
    return 0; 
} 

回答

2

我認爲你必須處理符號鏈接目錄的方式。有可能是你的無限循環來源:

說的/ tmp/foo是一個符號鏈接到/ tmp,那麼我認爲你的程序會進入死循環==/tmp目錄

+0

感謝您。回覆。是的,這是無限循環的原因,但我想不出處理子文件夾的另一種方式,這是我所問的問題。^_^ – William 2010-10-02 19:05:44

+1

我想處理符號鏈接作爲文件而不是目錄,我想。否則,您可能會離開源目錄並輸入文件系統的完全不同的部分。如果您必須取消引用符號鏈接,請在全局數組中保留已訪問的目錄名稱列表。 – fschmitt 2010-10-02 19:12:25

相關問題