Bagaimana cara mengubah tipe jalur boost ke string?

127

Halo Saya saat ini memiliki program yang mendapat path lengkap dari lokasi file dan dimasukkan ke dalam variabel yang merupakan tipe: boost :: filesystem2 :: path

Saya telah mencari cara untuk melakukan ini dan menemukan bahwa menggunakan:

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

akan mengubah jalur menjadi string TETAPI itu hanya mengubah nama file (mis. jika pathnya adalah "C: \ name \ bobsAwesomeWordDoc.docx" itu hanya mengembalikan "bobsAwesomeWordDoc").

Saya telah menemukan yang berikut tentang cara mengonversi seluruh jalur menjadi string, tetapi saya tidak tahu bagaimana cara mengimplementasikannya di program saya. Saya telah mencoba beberapa cara tetapi saya mendapatkan kesalahan konversi.

const std :: string & string (): Rutin ini mengembalikan salinan string yang jalurnya diinisialisasi, dengan pemformatan per aturan tata bahasa jalur.

(ditemukan di sini )

Saya telah mencoba:

string result1 = string& (myPath);

dan beberapa variasi lainnya.

Johnston
sumber

Jawaban:

164

Anda hanya perlu menelepon myPath.string().

icecrime
sumber
1
Apakah ada jaminan bahwa string mengembalikan jalur bersandikan utf8 pada semua platform?
Sergey Shambir
1
@SergeyShambir: Sayangnya tidak. Seseorang dapat secara eksplisit menggunakan u8string(), tetapi itu tidak membantu di mana string()digunakan secara otomatis.
Ceria dan hth. - Alf
13

Saya percaya Anda perlu melakukan sedikit lebih dari sekedar mengkonversi jalan ke string - pertama Anda harus mendapatkan versi kanonik jalan - path absolut tanpa unsur simbolik-link - dan mengkonversi yang ke dalam string:

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

PS - Saya sudah pemrograman dengan Boost sejak lama dan saya tidak bisa dengan mudah menemukan info ini di dokumen.


Pembaruan (Okt 2017)

Dokumentasi: boost :: filesystem :: canonical .

Tetapi perhatikan bahwa pada C ++ 17 ada std :: filesystem , dengan kanonik dan banyak lagi.

mengundurkan diri
sumber
Jawaban yang diterima adalah alternatif yang jauh lebih sederhana (dan berhasil)
alestanis
4
canonical sudah tidak digunakan lagi dalam versi baru dari Boost boost.org/doc/libs/1_48_0/libs/filesystem/v3/doc/…
Brian Jack
1
@ BrianJack ya, bagaimana itu usang? Sry, tidak dapat menemukan catatan resmi ... lihat juga referensi 1.60: boost.org/doc/libs/1_60_0/libs/filesystem/doc/…
Marco Alka
@MarcoAlka Lihat tabel tertaut boost.org/doc/libs/1_48_0/libs/filesystem/v3/doc/… dan catat baris kedua: class path canonize () Fungsi dihapus - artinya dihapus dulu di perpustakaan tetapi tidak lagi - definisi usang.
Brian Jack
2
@BrianJack Ini adalah canonizeyang sudah usang, per tautan kedua Anda, tetapi canonicaltampaknya tidak (per tautan pertama Anda, untuk 1_48 V3). Sekarang di C ++ 17 kita std::filesystemtentu saja
zdim
3

Ini bekerja di wxWidgets: (Saya tahu saya harus menggunakan utilitas wx tetapi itu adalah ujian)

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...      
}
Padi
sumber
1

Memanggil myPath.generic_string()akan melakukan apa yang Anda butuhkan.

J.Adler
sumber
0

Melakukan hal ini

path.c_str();

Kamu harus baik-baik saja

Dideorifikasi
sumber