Расширение пользовательского пути с помощью boost :: filesystem

Есть ли в boost::filesystem функция расширения путей, которые начинаются с символа домашнего каталога пользователя (~ в Unix), аналогично os.path.expanduser, представленная в Python?


person Daniel    schedule 19.10.2015    source источник
comment
Вы пробовали использовать boost.org? / doc / libs / 1_48_0 / libs / filesystem / v3 / doc /?   -  person Hamdor    schedule 20.10.2015
comment
@Hamdor Я пробовал что-то вроде canonical(path("~/test.txt")), но это не сработало. Неправильное использование?   -  person Daniel    schedule 20.10.2015
comment
Я сомневаюсь, что есть. Но см. Также stackoverflow.com/questions/4891006/   -  person WhiteViking    schedule 20.10.2015


Ответы (1)


Нет.

Но вы можете реализовать это, сделав что-то вроде этого:

  namespace bfs = boost::filesystem;
  using std;

  bfs::path expand (bfs::path in) {
    if (in.size () < 1) return in;

    const char * home = getenv ("HOME");
    if (home == NULL) {
      cerr << "error: HOME variable not set." << endl;
      throw std::invalid_argument ("error: HOME environment variable not set.");
    }

    string s = in.c_str ();
    if (s[0] == '~') {
      s = string(home) + s.substr (1, s.size () - 1);
      return bfs::path (s);
    } else {
      return in;
    }
  }

Также ознакомьтесь с предлагаемым аналогичным вопросом. пользователя @WhiteViking.

person gauteh    schedule 16.02.2017
comment
Обратите внимание, что это не кроссплатформенный подход и работа не гарантируется: stackoverflow.com/a/3733955/6296561 - person Zoe; 01.05.2020
comment
На самом деле это совершенно неправильно. Например, если вы вошли в систему как пользователь admin, он расширит ~ celmin / some / path до / home / admin / celmin / some / path вместо правильного / home / celmin / some / path. Даже если вы не хотите обрабатывать расширение каталога другого пользователя, вам, вероятно, следует хотя бы проверить, что вторым символом является /. (Также, как уже упоминалось, это работает только на платформах POSIX.) - person celticminstrel; 24.02.2021