如何将boost路径类型转换为字符串?


127

您好,我目前有一个程序,该程序获取文件位置的完整路径,并放入类型为boost :: filesystem2 :: path的变量中

我查找了如何执行此操作,并发现使用以下方法:

string result1 = boost::filesystem::basename (myPath)

会将路径转换为字符串,但仅转换文件名(例如,如果路径为“ C:\ name \ bobsAwesomeWordDoc.docx”,则仅返回“ bobsAwesomeWordDoc”)。

我发现了以下有关如何将整个路径转换为字符串的方法,但是我不知道如何在程序中实现它。我尝试了多种方法,但遇到转换错误。

const std :: string&string():此例程返回初始化路径的字符串的副本,并按照路径语法规则进行格式化。

(在这里找到)

我努力了:

string result1 = string& (myPath);

和其他一些变化。

Answers:


164

您只需要打电话myPath.string()


1
是否有保证在所有平台上字符串返回utf8编码路径?
谢尔盖·尚比尔

1
@SergeyShambir:不幸的是没有。可以显式使用u8string(),但这对string()自动在何处使用没有帮助。
干杯和健康。-Alf

13

我相信你需要做的多一点,只是路径转换为字符串-你应该首先获得该路径的规范版本-无符号链接元素的绝对路径-并转换为一个字符串:

boost::filesystem::canonical(myPath).string();

PS-我已经使用Boost编程很久了,我在文档中无法轻松找到此信息。


更新(2017年10月)

文档:boost :: filesystem :: canonical

但是请注意,从C ++ 17开始,有std :: filesystem,包括规范的内容以及更多内容。


公认的答案是一个简单得多的替代方法(它有效)
alestanis 2012年


1
@BrianJack呵呵,如何弃用?抱歉,找不到任何正式记录...另请参见1.60参考:boost.org/doc/libs/1_60_0/libs/filesystem/doc/…–
Marco Alka

@MarcoAlka参见链接表boost.org/doc/libs/1_48_0/libs/filesystem/v3/doc/…并注意第二行:类路径canonize()函数已删除-这意味着它曾经在库中,但不再存在-不推荐使用的定义。
布赖恩·杰克

2
@BrianJack在canonize您的第二个链接中已弃用,但canonical似乎并没有(在您的第一个链接中,对于1_48 V3)。现在在C ++ 17中,我们std::filesystem当然有了
zdim

3

这在wxWidgets中起作用:(我知道我应该只使用wx实用程序,但这是一个测试)

void WxWidgetsBoostTestFrame::OnTestBtnClick(wxCommandEvent& event)
{
    boost::filesystem::path currentPath;
    currentPath = boost::filesystem::current_path();
    std::string curDirString;
    curDirString = boost::filesystem::canonical(currentPath).string();
    wxString mystring(curDirString.c_str(), wxConvUTF8);
    wxMessageBox(mystring); // output:  C:/Users\client\Desktop...      
}


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.