是否有用于向文件路径添加尾部斜杠的习惯用法?

时间:2013-08-03 00:03:59

标签: c++ c linux

我有一个程序,它将文件夹路径作为命令行参数。然后我用文件名连接来访问这些文件。

例如,folder_path是“./config/” 然后file_path将是“./config/app.conf”,如下所示

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

但是如果folder_path不包含结尾斜杠,这将不起作用。这似乎是一个常见的问题,所以我想知道如果它不存在的话,最后是否有添加斜杠的成语。

3 个答案:

答案 0 :(得分:11)

如果路径位于名为pathname的std :: string中,我通常会这样做:

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

或者,使用basic_string :: back():

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

如有必要,请添加反斜杠的大小写。

补充:另请注意,* nix将处理路径名中的连续斜杠作为单斜杠。因此,在许多情况下,只需在不检查的情况下添加斜杠就足够了。

答案 1 :(得分:2)

如果你有一个额外的斜杠,Linux不会在意,所以/ home / user / hello和/ home / user // hello是同一个位置。您可以将斜杠添加为故障安全。或者,您可以通过检查最后一个字符来检查它。

答案 2 :(得分:0)

使用C ++ 14 / C ++ 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()。这样您就不必检查native path delimiters(WinAPI native!= generic,而Posix native = generic)。

您可能省略if (path.generic_string().back() != '/'),因为Posix和WinAPI不关心几个连续的路径分隔符。