ok, donc j'essaie d'obtenir un répertoire de dossiers et sous-dossiers, mais il va juste dans une boucle infinie. Quelle est la meilleure façon de créer un répertoire de dossiers et sous-dossiers? Parce que je n'ai vraiment aucune idée.Comment puis-je générer une arborescence de répertoires à partir d'un dossier racine et de tous ses sous-dossiers?
ceci est mon code à ce jour:
#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;
}
Merci pour votre. répondre. Oui, c'est la cause de la boucle sans fin, mais je ne peux pas penser à une autre façon de gérer les sous-dossiers, ce qui est la question que je pose.^_^ – William
Je voudrais gérer les liens symboliques aux répertoires en tant que fichiers au lieu de répertoires, je pense. Parce que sinon, vous pouvez quitter le répertoire source et entrer une partie complètement différente du système de fichiers. Si vous devez dé-référencer des liens symboliques, conservez une liste des noms de répertoires que vous avez déjà visités dans un tableau global. – fschmitt