2010-10-02 1 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

Я думаю, вы должны обрабатывать символические ссылки на каталоги по-разному. Там может быть источником для бесконечного цикла:

Say/TMP/Foo является символической ссылкой на/TMP, то я думаю, что ваша программа будет идти в бесконечный цикл, когда ==/TMP

+0

Благодарим Вас за. Ответить. Да, это причина бесконечного цикла, но я не могу думать о другом способе обработки подпапок, о чем я спрашиваю.^_^ – William

+1

Я бы рассматривал символические ссылки на каталоги как файлы, а не каталоги. Поскольку в противном случае вы можете покинуть исходный каталог и ввести совершенно другую часть файловой системы. Если вам нужно удалить ссылки на символические ссылки, сохраните список имен каталогов, которые вы уже посетили в глобальном массиве. – fschmitt