Я учусь использовать 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 (), по-видимому, не распознают entry-> d_name в качестве допустимого ввода. Когда я вызываю итеративную функцию, используя d_name, или использую ifstream с entry-> d_name, мои проверки, чтобы увидеть, открыт ли каталог или файл, завершаются неудачей. Сама функция работает, так как я проверил одну и ту же функцию с разными входами char *. Единственная проблема, о которой я могу думать, это то, что моя функция не принимает абсолютный путь в качестве параметра.
Мои вопросы, как я могу найти абсолютный путь к данному файлу или подкаталогу в точке итерации. Моим первоначальным решением было использовать «.» так как это текущий каталог. Хранить адрес «.» в строку и добавьте «\» + entry-> d_name. Но я думаю, что синтаксис неправильный.
Прав ли я насчет проблемы абсолютного пути? или есть еще одна проблема, которую мне не хватает? Если это проблема абсолютного пути, каков синтаксис для получения абсолютного пути к файлу?
Постскриптум
В прошлом мне сообщали, чтобы минимизировать объем кода, который я загружаю в переполнение стека для вопросов, и я представил то, что, по моему мнению, является наименьшим требуемым кодом. В случае, если информация, представленная выше, является недостаточной, я ссылаюсь на страницу github для кода.
https://github.com/ForeverABoy/dirent.h_practice/blob/master/directoryIterator.cpp
Любая помощь приветствуется. Спасибо!
Благодаря Сэму Варшавчику я разобрался в проблеме.
Проблема действительно заключалась в том, чтобы не вызывать функции, используя полные пути. Я знал это и сразу попытался исправить это с помощью realpath (). Проблема была в том, что я использовал realpath для записи-> d_name вместо имени каталога.
realpath(entry->d_name, buffer);
Это вернуло каталог сборки вместо каталога ввода. Я предполагаю, что это потому, что во время выполнения кода путь от переменной d_name будет действительно в каталоге сборки.
char* fullPath = realpath(inputPath, buffer);
Это дает мне фактический путь, который я ввел. Оттуда я просто превратил путь в строку и добавил путь, когда натолкнулся на каталоги или файлы.
Еще раз спасибо, Сэм. Вы правы. Когда я прочитал и полностью понял, что говорит руководство realpath (), все это имело смысл.
Других решений пока нет …