我们在应用程序中使用boost :: filesystem.我有一个'完整'路径,通过将几个路径连接在一起构建:
#include <boost/filesystem/operations.hpp>
#include <iostream>
namespace bf = boost::filesystem;
int main()
{
bf::path root("c:\\some\\deep\\application\\folder");
bf::path subdir("..\\configuration\\instance");
bf::path cfgfile("..\\instance\\myfile.cfg");
bf::path final ( root / subdir / cfgfile);
cout << final.file_string();
}
Run Code Online (Sandbox Code Playgroud)
最终路径打印为:
c:\some\deep\application\folder\..\configuration\instance\..\instance\myfile.cfg
Run Code Online (Sandbox Code Playgroud)
这是一个有效的路径,但是当我向用户显示它时,我更喜欢它被规范化.(注意:我甚至不确定"标准化"是否是正确的词).像这样:
c:\some\deep\application\configuration\instance\myfile.cfg
Run Code Online (Sandbox Code Playgroud)
早期版本的Boost有一个normalize()功能 - 但它似乎已被弃用和删除(没有任何解释).
有没有理由我不应该使用BOOST_FILESYSTEM_NO_DEPRECATED宏?有没有其他方法可以使用Boost Filesystem库执行此操作?或者我应该编写代码来直接将路径作为字符串操作?
如文档中所述,以下预期输出为:
boost::filesystem::path filePath1 = "/home/user/";
cout << filePath1.parent_path() << endl; // outputs "/home/user"
boost::filesystem::path filePath2 = "/home/user";
cout << filePath2.parent_path() << endl; // outputs "/home"
Run Code Online (Sandbox Code Playgroud)
问题是,你如何处理这个问题?也就是说,如果我接受一个路径作为参数,我不希望用户关心它是否应该有一个尾部斜杠.看起来最简单的事情就是附加一个尾部斜杠,然后调用parent_path()TWICE来获取我想要的"/ home"的父路径:
boost::filesystem::path filePath1 = "/home/user/";
filePath1 /= "/";
cout << filePath1.parent_path().parent_path() << endl; // outputs "/home"
boost::filesystem::path filePath2 = "/home/user";
filePath2 /= "/";
cout << filePath2.parent_path().parent_path() << endl; // outputs "/home"
Run Code Online (Sandbox Code Playgroud)
但这看起来很荒谬.在框架内有更好的方法来处理这个问题吗?