Come convertire il tipo di percorso boost in stringa?


127

Ciao Al momento ho un programma che ottiene un percorso completo della posizione di un file e viene inserito in una variabile che è il tipo di: boost :: filesystem2 :: path

Ho cercato come fare e ho scoperto che usando:

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

convertirà il percorso in stringa MA converte solo il nome del file (ad es. se il percorso è "C: \ name \ bobsAwesomeWordDoc.docx" restituisce semplicemente "bobsAwesomeWordDoc").

Ho trovato quanto segue su come convertire l'intero percorso in stringa, ma non so come implementarlo nel mio programma. Ho provato diversi modi ma sto riscontrando errori di conversione.

const std :: string & string (): questa routine restituisce una copia della stringa con cui è stato inizializzato il percorso, con formattazione secondo le regole grammaticali del percorso.

(trovato qui )

Ho provato:

string result1 = string& (myPath);

e alcune altre varianti.

Risposte:


164

Devi solo chiamare myPath.string().


1
Ci sono garanzie che la stringa restituisca il percorso codificato utf8 su tutte le piattaforme?
Sergey Shambir,

1
@SergeyShambir: Sfortunatamente no. Si può usare esplicitamente u8string(), ma ciò non aiuta dove string()viene usato automaticamente.
Saluti e hth. - Alf,

13

Credo che hai bisogno di fare un po 'di più che convertire il tracciato in una stringa - si deve prima ottenere la versione canonica del percorso - un percorso assoluto senza elementi simbolico-link - e convertire che in una stringa:

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

PS: sto programmando con Boost da anni e non sono riuscito a trovare facilmente queste informazioni nei documenti.


Aggiornamento (ottobre 2017)

Documentazione: boost :: filesystem :: canonical .

Ma nota che a partire da C ++ 17 c'è std :: filesystem , con canonico e molto altro.


La risposta accettata è un'alternativa molto più semplice (e funziona)
alestanis,

4
canonical è deprecato nelle versioni più recenti di Boost boost.org/doc/libs/1_48_0/libs/filesystem/v3/doc/…
Brian Jack,

1
@BrianJack eh, come viene deprecato? Sry, non riesco a trovare alcuna nota ufficiale ... vedi anche riferimento 1.60: boost.org/doc/libs/1_60_0/libs/filesystem/doc/…
Marco Alka,

@MarcoAlka Vedi la tabella collegata boost.org/doc/libs/1_48_0/libs/filesystem/v3/doc/… e nota la seconda riga: class path canonize () Funzione rimossa - significa che era una volta nella libreria ma non più - la definizione di deprecato.
Brian Jack,

2
@BrianJack È quello canonizeche è deprecato, per il tuo secondo link, ma canonicalnon sembra essere (per il tuo primo link, per 1_48 V3). Ora in C ++ 17 abbiamo std::filesystemovviamente
zdim,

3

Questo ha funzionato in wxWidgets: (So che dovrei usare solo le utility wx ma è un test)

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

La chiamata myPath.generic_string()farà ciò di cui hai bisogno.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.