Я учусь использовать dirent.h. Хотя процесс увлекательный и интересный, я столкнулся с проблемой использования d_name.
Я хочу сделать две вещи, используя d_name.
рекурсивный поиск по подкаталогам. К этому, когда я столкнусь с файлами типа DT_DIR, я сделаю рекурсивный вызов функции
void iterateDirectory(char* filePath){ DIR* dirPtr; dirent* entry; entry = readdir(dirPtr); ... }
внутри себя, используя d_name каталога в качестве нового параметра char* 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; ... }
Проблема, с которой я сталкиваюсь, заключается в том, что ни функция void iterateDirectory(), ни функция ifstream fin() не распознают запись->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 filePath для foo/bar, аd_name
— это baz, чтобы открыть этот файл, вам, очевидно, нужно открыть foo/bar/baz, а не только то, что вы видите вd_name
. - person Sam Varshavchik   schedule 26.11.2016realpath()
в имени каталога, чтобы получить абсолютный путь к каталогу. Затем добавьтеd_name
. - person Sam Varshavchik   schedule 26.11.2016realpath()
. Не просто читайте слова. Поймите, что это значит, и все должно быть кристально ясно. - person Sam Varshavchik   schedule 26.11.2016