11

我有一个将文件夹路径作为命令行参数的程序。然后我将其与文件名连接以访问这些文件。

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

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

但如果 folder_path 不包含结束斜杠,这将不起作用。这似乎是一个常见问题,所以我想知道如果它不存在,是否有一个习惯用法可以在末尾添加斜杠。

4

3 回答 3

13

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

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

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

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

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

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

于 2013-08-03T00:07:00.250 回答
2

Linux 不会关心你是否有额外的斜线,所以 /home/user/hello 和 /home/user//hello 是同一个位置。您可以添加斜杠作为故障保护。或者,您可以通过检查最后一个字符来检查它。

于 2013-08-03T00:41:22.723 回答
2

使用 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(). 这样您就不必检查本机路径分隔符(WinAPI 本机!= 通用,而 Posix 本机 = 通用)。

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

于 2017-04-28T06:56:48.610 回答