ブーストパスタイプを文字列に変換する方法は?


127

こんにちは私は現在、ファイルの場所の完全なパスを取得し、次のタイプの変数に入れられるプログラムを持っています:boost :: filesystem2 :: path

私はこれを行う方法を調べ、それを使用してそれを見つけました:

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

パスを文字列に変換しますが、ファイル名のみを変換します(たとえば、パスが "C:\ name \ bobsAwesomeWordDoc.docx"の場合、 "bobsAwesomeWordDoc"を返します)。

パス全体を文字列に変換する方法については以下を見つけましたが、プログラムに実装する方法がわかりません。複数の方法を試しましたが、変換エラーが発生します。

const std :: string&string():このルーチンは、パスが初期化された文字列のコピーを、パスの文法規則に従ってフォーマットして返します。

ここにあります

私が試してみました:

string result1 = string& (myPath);

と他のいくつかのバリエーション。

回答:


164

あなただけを呼び出す必要がありますmyPath.string()


1
文字列がすべてのプラットフォームでutf8エンコードされたパスを返す保証はありますか?
セルゲイシャンビル2017年

1
@SergeyShambir:残念ながらそうではありません。は明示的に使用できますがu8string()、がstring()自動的に使用される場所には役立ちません。
乾杯とhth。-Alf

13

パスを文字列に変換するだけではなく、もう少し行う必要があると思います。まず、パスの正規バージョン(シンボリックリンク要素のない絶対パス)を取得し、それを文字列に変換する必要があります。

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

PS-私は何年もの間Boostでプログラミングをしていて、ドキュメントでこの情報を簡単に見つけることができませんでした。


アップデート(2017年10月)

ドキュメント:boost :: filesystem :: canonical

ただし、C ++ 17以降ではstd :: filesystemがあり、標準的なものやそれ以上のものがあることに注意してください。


受け入れられた答えは、はるかに単純な代替案です(そしてそれは機能します)
alestanis


1
@BrianJackハァッ、それはどのように廃止されたのですか?SRY、また1.60リファレンスを参照してください...公式のノートを見つけることができません。boost.org/doc/libs/1_60_0/libs/filesystem/doc/...
マルコ・アルカ

@MarcoAlka参照リンクテーブルboost.org/doc/libs/1_48_0/libs/filesystem/v3/doc/...、2行目に注意:クラスパスcanonize()関数を削除-それは、ライブラリに一度だった手段が、もはやこと-非推奨の定義。
ブライアンジャック

2
@BrianJackこれは、canonize2番目のリンクごとに廃止された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...      
}

1

呼び出しmyPath.generic_string()はあなたが必要なことを行います。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.