2016-11-26 21 views
2

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

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

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

Проблема Я бегу в, что ни функция аннулируются 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

Любые и все помогает оценены. Спасибо!

+0

'd_name' - это имя файла в каталоге. Если вы 'opendir()' ed a * filePath * из «foo/bar», а 'd_name' -« baz », чтобы открыть этот файл, вам, очевидно, нужно открыть« foo/bar/baz », а не только что вы видите в 'd_name'. –

+0

Sam, Благодарим за помощь. Я понимаю, что проблема связана с абсолютным путем, и я пытаюсь найти способ получить абсолютный путь каталога от данного ввода. Использование realpath (entry-> d_name, buffer) не помогло, потому что 1. realpath дает мне каталог сборки моего кода вместо входного каталога. 2. Даже с каталогом создания файлов он не обновляет адрес для подкаталогов. после перехода от foo к foo/bar, когда он ищет baz, realpath() дает мне foo/baz вместо foo/bar/baz. –

+1

Используйте 'realpath()' для имени *** каталога ***, чтобы получить абсолютный путь к каталогу. Затем добавьте 'd_name'. –

ответ

0

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

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

realpath(entry->d_name, buffer); 

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

char* fullPath = realpath(inputPath, buffer); 

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

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