如何使用 C++ 获取 folder/directory 名称,但不是一个文件的路径?特别是 boost::filesystem;

how to use C++ to get the folder/directory name, but not the path of one file? Especially boost::filesystem;

    std::string file="C:\folder1\folder2\folder3.txt";
fs::path file_path(file);
fs::path file_dir=file_path.parent_path();// "C:\folder1\folder2";
std::string str_path=file_path.string();
std::string str_dir=file_dir.string();
std:string str_folder=str_path.erase(0,str_dir()+1);// return folder2

这是我用的方法。它对我有用,但看起来很难看。所以我更喜欢寻找 boost::filesystems 或其他优雅的代码。 笔记: 这个问题没有重复,并且与提出的问题 Getting a directory name from a filename 略有不同。我的兴趣是找到文件名而不是整个目录路径。

您也可以使用路径迭代器来查找最后一个目录。不过也不是很漂亮。

示例

boost::filesystem::path p{"/folder1/folder2/folder3.txt"};
boost::filesystem::path::iterator last_dir;
for (auto i = p.begin(); i != p.end(); ++i)
{
    if (*i != p.filename())
        last_dir = i;
}
std::cout << *last_dir << '\n';

以上代码的输出应该是"folder2".

以上代码使用了Unix路径,但Windows路径原理相同

来自

的相同结果
last_dir = p.end();
--last_dir;
--last_dir;
std::cout << *last_dir << '\n';

这个问题是在另一个堆栈 post 中提出的。 Boost filesystem

在你的情况下,你可以这样做。

boost::filesystem::path p("C:\folder1\folder2\folder3.txt"); boost::filesystem::path dir = p.parent_path();

您可以使用 parent_path 删除路径中的最后一个元素,然后使用 filename 获取最后一个元素。 示例:包括 boost/filesystem.hpp 和 iostream

namespace fs = boost::filesystem;
int main()
{
   fs::path p ("/usr/include/test");
   std::cout << p.parent_path().filename() << "\n";
}

应该打印 "include".