Есть ли идиома для добавления конечной косой черты в путь к файлу?

У меня есть программа, которая принимает путь к папке в качестве аргумента командной строки. И затем я конкатенирую это с именами файлов для доступа к этим файлам.

Например, папка_папка "./config/" а затем file_path будет "./config/app.conf", как показано ниже

stringstream ss;
ss << folder_path << "app.conf";
file_path = ss.str();

Но это не сработает, если папка_папка не содержит косой черты. Это похоже на общую проблему, поэтому мне было интересно, есть ли там идиома для добавления косой черты в конце, если она не существует.

Ответ 1

Я обычно делаю это, если путь находится в std::string с именем pathname:

if (!pathname.empty() && *pathname.rbegin() != '/')
    pathname += '/';

Или, с basic_string:: back():

if (!pathname.empty() && pathname.back() != '/')
    pathname += '/';

Добавьте футляр для обратной косой черты, если необходимо.

Добавлено: Также обратите внимание, что * nix будет обрабатывать последовательные слэши в именах путей как одну косую черту. Поэтому во многих ситуациях достаточно просто добавить косую черту без проверки.

Ответ 2

Linux не заботится, если у вас есть дополнительная косая черта, поэтому /home/user/hello и/home/user//hello - это то же место. Вы можете добавить косую черту как отказоустойчивую. Или вы можете проверить его, проверив последний символ.

Ответ 3

Использование С++ 14/С++ 17 std::filesystem:

#include <experimental/filesystem> // C++14.
namespace fs = std::experimental::filesystem; // C++14.
//#include <filesystem> // C++17.
//namespace fs = std::filesystem; // C++17.

void addTrailingDelimiter(fs::path& path) {
    if (!path.empty() && path.generic_string().back() != '/')
        path += '/';
}

Учтите fs::path::generic_string(). Таким образом, вам не нужно проверять собственные разделители путей (WinAPI native!= Generic, а Posix native = generic).

Вы можете опустить if (path.generic_string().back() != '/'), так как Posix и WinAPI не заботятся о нескольких последовательных разделителях путей.