如何使用C ++获取文件夹/目录名,而不是一个文件的路径?特别是boost :: filesystem;

时间:2016-09-01 15:23:33

标签: c++ 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没有重复和轻微不同。我的兴趣是找到文件名,但不是整个目录路径。

3 个答案:

答案 0 :(得分:4)

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

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

应打印&#34;包含&#34;。

答案 1 :(得分:0)

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

实施例

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';

答案 2 :(得分:-1)

在另一个堆叠帖子中询问了这个问题。 Boost filesystem

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

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