如何从根文件夹及其所有子文件夹生成目录树?
问题描述:
好吧,所以我试图得到一个文件夹和子文件夹的目录,但它只是进入一个无限循环。什么是创建文件夹和子文件夹目录的更好方法?因为我真的不知道。如何从根文件夹及其所有子文件夹生成目录树?
这是我到目前为止的代码:
#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;
}
答
我认为你必须处理符号链接目录的方式。有可能是你的无限循环来源:
说的/ tmp/foo是一个符号链接到/ tmp,那么我认为你的程序会进入死循环==/tmp目录
感谢您。回复。是的,这是无限循环的原因,但我想不出处理子文件夹的另一种方式,这是我所问的问题。^_^ – William 2010-10-02 19:05:44
我想处理符号链接作为文件而不是目录,我想。否则,您可能会离开源目录并输入文件系统的完全不同的部分。如果您必须取消引用符号链接,请在全局数组中保留已访问的目录名称列表。 – fschmitt 2010-10-02 19:12:25