Я учусь использовать dirent.h. Хотя процесс увлекательный и интересный, у меня возникла проблема с использованием d_name.C++ dirent.h и синтаксис для получения абсолютного пути
Я хочу сделать две вещи, используя d_name.
рекурсивно искать в подкаталогах. Для этого, когда я сталкиваюсь с файлами типа DT_DIR, я буду делать рекурсивный вызов функции
void iterateDirectory(char* filePath){ DIR* dirPtr; dirent* entry; entry = readdir(dirPtr); ... }
в себе с помощью d_name каталога как новый символ * параметр Filepath. Таким образом,
if(dirEntry->d_type == DT_DIR){ entry->d_name; iterateDirectory(entry->d_name); ... }
Открыть все файлы в пределах одной директории. Для этого, когда я сталкиваюсь с файлами DT_REG, я создам объект ifstream и открою файл, используя d_name. Так,
if(dirEntry->d_type == DT_REG){ entry->d_name; ifstream fin(entry->d_name); if(fin.is_open) cout<<"Opened"<<endl; else cout<<"Not Opened"<<endl; ... }
Проблема Я бегу в, что ни функция аннулируются iterateDirectory(), ни ifstream плавник(), кажется, признают entry-> d_name как действительный вход. Когда я вызываю функцию итерации с помощью d_name или использую ifstream с именем entry-> d_name, мои проверки, чтобы проверить, открыт ли каталог или файл, не удается. Сама функция работает, поскольку я проверил ту же самую функцию с различными входами char *. Единственная проблема, о которой я могу думать, это то, что моя функция не принимает абсолютный путь в качестве параметра.
Мои вопросы: как я могу найти абсолютный путь для данного файла или подкаталога в точке итерации. Моим первоначальным решением было использовать «.». поскольку это текущий каталог. Сохраните адрес «.». в строку и добавьте «\» + entry-> d_name. Но я думаю, что синтаксис неверен.
Я прав о проблеме абсолютного пути? или есть еще одна проблема, которую мне не хватает? Если это проблема абсолютного пути, каков синтаксис для получения абсолютного пути к файлу?
P.S.
Мне сообщалось в прошлом, чтобы свести к минимуму количество загружаемого кода для переполнения стека для вопросов, и я представил то, что я считаю самым маленьким требуемым кодом. Если информация, представленная выше, недостаточна, я связываю страницу github для кода.
https://github.com/ForeverABoy/dirent.h_practice/blob/master/directoryIterator.cpp
Любые и все помогает оценены. Спасибо!
'd_name' - это имя файла в каталоге. Если вы 'opendir()' ed a * filePath * из «foo/bar», а 'd_name' -« baz », чтобы открыть этот файл, вам, очевидно, нужно открыть« foo/bar/baz », а не только что вы видите в 'd_name'. –
Sam, Благодарим за помощь. Я понимаю, что проблема связана с абсолютным путем, и я пытаюсь найти способ получить абсолютный путь каталога от данного ввода. Использование realpath (entry-> d_name, buffer) не помогло, потому что 1. realpath дает мне каталог сборки моего кода вместо входного каталога. 2. Даже с каталогом создания файлов он не обновляет адрес для подкаталогов. после перехода от foo к foo/bar, когда он ищет baz, realpath() дает мне foo/baz вместо foo/bar/baz. –
Используйте 'realpath()' для имени *** каталога ***, чтобы получить абсолютный путь к каталогу. Затем добавьте 'd_name'. –