Есть ли идиома для добавления конечной косой черты в путь к файлу?
У меня есть программа, которая принимает путь к папке в качестве аргумента командной строки. И затем я конкатенирую это с именами файлов для доступа к этим файлам.
Например, папка_папка "./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 не заботятся о нескольких последовательных разделителях путей.