Yükseltme yolu türü dizeye nasıl dönüştürülür?


128

Merhaba Şu anda bir dosyanın tam konumunu alan ve şu türde bir değişkene yerleştirilen bir programım var: boost :: filesystem2 :: path

Bunu nasıl yapacağımı araştırdım ve şunu kullanarak buldum:

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

yolu dizeye dönüştürür ANCAK yalnızca dosya adını dönüştürür (örneğin, yol "C: \ name \ bobsAwesomeWordDoc.docx" ise yalnızca "bobsAwesomeWordDoc" döndürür).

Tüm yolu dizeye nasıl dönüştüreceğime dair aşağıdakileri buldum, ancak programımda nasıl uygulayacağımı bilmiyorum. Birden çok yol denedim ama dönüştürme hataları alıyorum.

const std :: string & string (): Bu rutin, yol dilbilgisi kurallarına göre biçimlendirme ile yolun başlatıldığı dizenin bir kopyasını döndürür.

( burada bulundu )

Denedim:

string result1 = string& (myPath);

ve diğer birkaç varyasyon.

Yanıtlar:


165

Sadece araman gerekiyor myPath.string().


1
Dizenin tüm platformlarda utf8 kodlanmış yolu döndürdüğüne dair garantiler var mı?
Sergey Shambir

1
@SergeyShambir: Maalesef hayır. Kişi açıkça kullanabilir u8string(), ancak bu string()otomatik olarak nerede kullanıldığına yardımcı olmaz .
Şerefe ve hth. - Alf

13

Yolu bir dizgeye dönüştürmekten biraz daha fazlasını yapmanız gerektiğine inanıyorum - önce yolun kanonik sürümünü - sembolik bağlantı öğeleri içermeyen mutlak bir yol - ve bunu bir dizeye dönüştürmelisiniz :

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

Not - Yıllardır Boost ile programlama yapıyorum ve bu bilgiyi belgelerde kolayca bulamadım.


Güncelleme (Ekim 2017)

Belgeler: boost :: filesystem :: canonical .

Ancak, C ++ 17'den itibaren standart ve çok daha fazlasını içeren std :: dosya sistemi olduğunu unutmayın .


Kabul edilen cevap çok daha basit bir alternatif (ve işe yarıyor)
alestanis


1
@BrianJack ha, nasıl kullanımdan kaldırıldı? Sry, herhangi bir resmi not bulunamadı ... ayrıca bkz. 1.60 referans: boost.org/doc/libs/1_60_0/libs/filesystem/doc/…
Marco Alka

Bağlantılı tablo Bkz @MarcoAlka boost.org/doc/libs/1_48_0/libs/filesystem/v3/doc/... ve ikinci satır not: sınıf yolu canonize () kaldırıldı Fonksiyonu - araçlarının o zamanlar kütüphanede ama artık oldu - kullanımdan kaldırılmış'ın tanımı.
Brian Jack

2
@BrianJack canonizeİkinci bağlantınız için kullanımdan kaldırılan ama canonicalöyle görünmeyen (ilk bağlantınız başına, 1_48 V3 için). Şimdi C ++ 17'de std::filesystemelbette var
zdim

3

Bu wxWidgets'da çalıştı: (Sadece wx yardımcı programlarını kullanmam gerektiğini biliyorum ama bu bir 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

Aramak myPath.generic_string()ihtiyacın olanı yapacak.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.