Я хочу создать метод, который читает каталог и находит и сохраняет в структуре данных все указанные каталоги, а также все подкаталоги каждой директории. В частности я хочу, чтобы имена цитировать:Найти каталоги и подкаталоги через рекурсию в C++
folder1 folder11 folder12 folder2 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''. Вы также не освобождаете выделенную память. Но вместо использования временного буфера, почему бы не передать 'temp.c_str()' непосредственно на рекурсивный вызов? –
Кроме того, вы пытаетесь перезаписать файлы _all_. Вы должны проверить, действительно ли это _is_ каталог, который можно проверить с помощью 'ep-> d_type == DT_DIR'. Или, если не существует поля 'ep-> d_type', вы, например, 'stat', чтобы получить тип. –