boost :: filesystem :: create_directory выдал boost :: filesystem :: filesystem_error: неверный адрес - PullRequest
0 голосов
/ 21 мая 2018

TL; DR моего кода выглядит следующим образом:

server::server(boost::filesystem::path mappath) : mappath(mappath) {
    if(boost::filesystem::is_directory(mappath) && boost::filesystem::exists(mappath)) {
        // Do some stuff here
    } else {
        boost::filesystem::create_directory(mappath);
    }
}

Код работает, когда существует mappath (едва ли, поскольку я считаю, что Boost является segfaulting почти во всех функциях).
Однако, когда это не так, он выдает исключение с сообщением «Неверный адрес».
Когда я печатаю mappath через std::cout, он возвращает:

"/home/myusername/.testfolder/huni/ENTER YOUR TEXT HERE"

Что правильно.

Обратите внимание, что когда я пытаюсь напечатать mappath внутри оператора else, он вызывает ошибки.
Я пришел к выводу, что что-то не так с mappath в is_directory илиexists, поскольку при печати до оператора if не было ошибок.

Ответы [ 2 ]

0 голосов
/ 10 июня 2018

Оказалось, Bad address - ошибка, специфичная для POSIX.

Кроме того, причина, по которой я не смог напечатать mappath в предложении else моего оператора if, заключалась в том, что is_directory портилсо ссылкой.
Что он на самом деле делал, я не мог понять.

Итак, я переключился с Boost на что-то, что действительно работает.

0 голосов
/ 21 мая 2018

Я написал MCVE для себя.Когда путь не существует, boost выдает

terminate called after throwing an instance of 'boost::filesystem::filesystem_error'
  what():  boost::filesystem::create_directory: No such file or directory
Aborted (core dumped)

, потому что ваша программа сначала проверяет, является ли путь каталогом, а затем проверяет, существует ли путь (правильный).

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

Если путь существует и является файлом, boost выдает

terminate called after throwing an instance of 'boost::filesystem::filesystem_error'
  what():  boost::filesystem::create_directory: File exists
Aborted (core dumped)

, поскольку не можетсоздайте каталог (правильно).

Следовательно, ваш фрагмент делает то, что должен делать.Возможно, вам следует изменить порядок в вашем операторе if и добавить проверку к вашему else:

#include <boost/filesystem.hpp>
#include <iostream>

class server {
public:
  server(boost::filesystem::path mappath) : mappath(mappath) {
    if(boost::filesystem::exists(mappath) && boost::filesystem::is_directory(mappath)) {
        // Do some stuff here
    } else if (!boost::filesystem::exists(mappath)) {
        boost::filesystem::create_directory(mappath);
    }
  }
private:
  boost::filesystem::path mappath;
};

int main() {
  server s("/path/test");
  return 0;
}

Теперь программа проверяет, существует ли путь.Если путь существует, программа проверяет, является ли путь каталогом.Если путь не существует, каталог создается.

...