файл io — c ++ dirent.h и синтаксис для получения абсолютного пути

Я учусь использовать dirent.h. Хотя процесс увлекательный и интересный, я столкнулся с проблемой использования d_name.

Я хочу сделать две вещи, используя d_name.

  1. рекурсивный поиск по подкаталогам. Для этого, когда я сталкиваюсь с файлами типа 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);
    ...
    }
    
  2. Откройте все файлы в каталоге. Для этого, когда я столкнусь с файлами 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

Любая помощь приветствуется. Спасибо!

2

Решение

Благодаря Сэму Варшавчику я разобрался в проблеме.

Проблема действительно заключалась в том, чтобы не вызывать функции, используя полные пути. Я знал это и сразу попытался исправить это с помощью realpath (). Проблема была в том, что я использовал realpath для записи-> d_name вместо имени каталога.

realpath(entry->d_name, buffer);

Это вернуло каталог сборки вместо каталога ввода. Я предполагаю, что это потому, что во время выполнения кода путь от переменной d_name будет действительно в каталоге сборки.

char* fullPath = realpath(inputPath, buffer);

Это дает мне фактический путь, который я ввел. Оттуда я просто превратил путь в строку и добавил путь, когда натолкнулся на каталоги или файлы.

Еще раз спасибо, Сэм. Вы правы. Когда я прочитал и полностью понял, что говорит руководство realpath (), все это имело смысл.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector