Страницы

Поиск по вопросам

среда, 17 июля 2019 г.

Как получить древовидную структуру файловой системы?

Нужно получить список файлов в директориях и поддиректориях в таком виде:
A\B\1 A\B\2 A\B\C\1 A\B\C\2 A\B\C\3 A\B\C\D\1 A\B\C\D\2 A\E\1 A\E\2 ...
Ясно, что нужно использовать рекурсию. Вот, что у меня получилось:
#include #include #include #include #include
struct Tree { bool is_folder; wchar_t data[256]; unsigned children_num; struct Tree* parent; struct Tree* children[1024]; };
void create_tree(struct Tree* node);
int main() { struct Tree Root = { .is_folder = true, .data = L"C:\\Users\\user\\Music", .parent = NULL, .children_num = 0 };
create_tree(&Root);
return 0; }
void create_tree(struct Tree* Root) { WIN32_FIND_DATAW find_file_data; HANDLE file_handel;
/* Файлы и директории ищутся по маске. Т.е. мы находим все файлы подходящие под маску "C:\\Users\\user\\Music\\*". */ wchar_t patch[258]; wcscpy(patch, Root->data); wcscat(patch, L"\\*");
file_handel = FindFirstFileW(patch, &find_file_data); if (file_handel != INVALID_HANDLE_VALUE) { do { /* "." - текущая директория, ".." - директория уровнем выше. */ if (!wcscmp(find_file_data.cFileName, L".") || !wcscmp(find_file_data.cFileName, L"..")) { continue; }
struct Tree* node = malloc(sizeof(*node)); node->children_num = 0; /* Записываем имя элемента. */ wcscpy(node->data, find_file_data.cFileName);
/* Мы нашли директорию. */ if ((find_file_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) { node->is_folder = true; /* По-идее, так как в этой директории могут быть свои файлы и подпапки, нужно обработать и их. */ create_tree(node); } else { node->is_folder = false; }
wprintf(L"%s\\%s%s", Root->data, node->data, node->is_folder ? L"\\
" : L"
");
/* Добавляем елемент в дерево. */ Root->children[Root->children_num] = node; Root->children_num++; } while (FindNextFileW(file_handel, &find_file_data));
FindClose(file_handel); } }
Вот результат работы программы:
C:\Users\user\Music\1.txt C:\Users\user\Music\25-17\ C:\Users\user\Music\2Pac\ C:\Users\user\Music\5'nizza\ C:\Users\user\Music\50 Cent\ C:\Users\user\Music\ACDC\ C:\Users\user\Music\Avicii\ C:\Users\user\Music\Beatles\ C:\Users\user\Music\CENTER\ C:\Users\user\Music\Chuck Berry\ C:\Users\user\Music\Classic\ C:\Users\user\Music\Covers\ C:\Users\user\Music\Cranberries\ C:\Users\user\Music\Crash Test Dummies\ C:\Users\user\Music\Dash\ C:\Users\user\Music\David Bowie\ C:\Users\user\Music\desktop.ini C:\Users\user\Music\Eminem\ C:\Users\user\Music\Imagine Dragons\ C:\Users\user\Music\John Lenon\ C:\Users\user\Music\Kellee Maize\ C:\Users\user\Music\KISS\ C:\Users\user\Music\Kongos\ C:\Users\user\Music\Lil Peep\ C:\Users\user\Music\Lil Pump\ C:\Users\user\Music\Linkin Park\ C:\Users\user\Music\Metallica\ C:\Users\user\Music\MS MR\ C:\Users\user\Music\Nautilus Pompilus\ C:\Users\user\Music\Nirvana\ C:\Users\user\Music\Noize MC\ C:\Users\user\Music\Old Gods of Asgard\ C:\Users\user\Music\One Rupublic\ C:\Users\user\Music\Other\ C:\Users\user\Music\Oxxxymiron\ C:\Users\user\Music\Pink Floyd\ C:\Users\user\Music\Poets of the Fall\ C:\Users\user\Music\Post Malone\ C:\Users\user\Music\Radiohead\ C:\Users\user\Music\Roy Jones Jr\ C:\Users\user\Music\Soundtracks\ C:\Users\user\Music\Sting\ C:\Users\user\Music\The Animals\ C:\Users\user\Music\The Lonely Biscuits\ C:\Users\user\Music\The Shins\ C:\Users\user\Music\The Wanted\ C:\Users\user\Music\Three Days Grace\ C:\Users\user\Music\Twenty One Pilots\ C:\Users\user\Music\VLNY\ C:\Users\user\Music\Yong Jeezy\ C:\Users\user\Music\Zayde Wolf\
Как видно, выводятся директории и файлы только первого уровня. В связи с этим, пару вопросов:
Правильно ли написан алгоритм? Если да, то почему программа работает неверно? Есть ли более лучший способ выполнить эту задачу?


Ответ

У вас в node->data, как я понял лежит только имя файла, без пути к нему. И когда вы вызываете рекурсивно create_tree, то на входе в Root->data видит только имя файла и, конечно, ничего найти не может. В node->data надо класть полный путь от корня. – Mike

Комментариев нет:

Отправить комментарий