我想创建一个方法来读取目录,并在数据结构中查找并保存所有包含的目录,以及每个目录的所有子目录。具体来说,我想将这些名称引用为:
folder1中 folder11 folder12 文件夹2 folder21 folder22 folder23
我显然需要一个带递归的函数。 我在控制台应用程序中使用临时的类成员方法:
private:
struct dirent *ep;
void DirectoryReader::parseDirectory(char* readingDirectory)
{
char* tempDirectory = (char*)malloc(sizeof(readingDirectory) + 200);
string temp = readingDirectory;
DIR *dp;
dp = opendir (readingDirectory);
if (dp != NULL)
{
while (ep = readdir (dp))
{
puts (ep->d_name);
temp += readingDirectory;
temp += "/";
temp += ep->d_name;
char * buffer = new char[temp.length()];
strcpy(buffer,temp.c_str());
parseDirectory(buffer);
}
(void) closedir (dp);
}
else
perror ("Couldn't open the directory");
}
好的,我不知道最好的书面代码,但我最初希望看到被捕的名字。但是它无法正常工作,因为它不止一次地考虑父目录的名称。即使我把相同方法的调用(不执行递归)放在前两个名称中。和......为什么呢?
您能否建议我执行上述过程的功能或指示此功能需要更正?
答案 0 :(得分:4)
正如一些评论指出的那样,boost :: filesystem是通常的方法。 但是从你的代码来看,你似乎仍然是C ++的新手,所以我用C ++惯用的方式重写,添加了一些有用的显示。 HTH
#include <dirent.h>
#include <iostream>
#include <string>
using namespace std;
struct DirectoryReader
{
static void parseDirectory(string readingDirectory, int level);
};
void DirectoryReader::parseDirectory(string readingDirectory, int level)
{
if (DIR *dp = opendir(readingDirectory.c_str()))
{
cout << string(level, ' ') << readingDirectory << endl;
while (struct dirent *ep = readdir(dp))
if (ep->d_type == DT_DIR && ep->d_name[0] != '.')
parseDirectory(readingDirectory + "/" + ep->d_name, level + 1);
closedir(dp);
}
else
cerr << "Couldn't open the directory " << readingDirectory << endl;
}
int main_parsedir(int argc, char **argv)
{
if (argc > 1)
DirectoryReader::parseDirectory(argv[1], 0);
return 0;
}
请注意,在您的代码中,在类中存储struct dirent *ep;
是完全错误的,因为您在递归时会覆盖它...
答案 1 :(得分:2)
目录枚举函数通常返回当前目录(。)和父目录(..)链接。你需要忽略它们。此外,您需要检查ep-&gt; d_type。我已经为您编写了以下功能。请检查这是否按预期工作。 我没有使用空格分隔符输出,因为单个文件夹中可以包含空格字符。 此外,我不确定你将如何使用此输出,因为它会丢失树结构。
#include "dirent.h"
const string theDelimiter = "\\";
class DirectoryReader
{
public:
string DirectoryReader::parseDirectory(string readingDirectory, const string& aCurrentFolderName)
{
string aChildren;
aChildren += theDelimiter;
aChildren += aCurrentFolderName;
DIR *dp = opendir (readingDirectory.c_str());
if (dp != NULL)
{
struct dirent *ep = NULL;
while ((ep = readdir (dp)) && ep->d_type == DT_DIR )
{
string aDirName = ep->d_name;
// Ignore current directory and the parent directory links
if(!aDirName.compare(".") || !aDirName.compare(".."))
continue;
// Form the full directory path
string aFullFolderName = readingDirectory;
aFullFolderName += string("\\");
aFullFolderName += aDirName;
string aChildrenFolders = parseDirectory(aFullFolderName, aDirName);
if(aChildrenFolders.compare(""))
{
aChildren += aChildrenFolders;
}
}
(void) closedir (dp);
}
else
perror ("Couldn't open the directory");
return aChildren;
}
};