बूस्ट पाथ टाइप को स्ट्रिंग में कैसे बदलें?


127

नमस्कार मेरे पास वर्तमान में एक प्रोग्राम है जो फ़ाइल के स्थान का पूरा पथ प्राप्त करता है और इसे एक चर में रखा जाता है जो इस प्रकार है: बढ़ावा :: filesystem2 :: पथ

मैंने देखा है कि यह कैसे करना है और पाया है कि उपयोग करना:

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

पथ को स्ट्रिंग में परिवर्तित करेगा लेकिन यह केवल फ़ाइल नाम को परिवर्तित करता है (जैसे यदि पथ "C: \ name \ bobsAwesomeWordDoc.docx" है तो यह "bobsAwesomeWordDoc" देता है)।

मैंने निम्नलिखित पाया है कि कैसे पूरे पथ को स्ट्रिंग में परिवर्तित किया जाए, लेकिन मुझे नहीं पता कि इसे अपने कार्यक्रम में कैसे लागू किया जाए। मैंने कई तरीके आज़माए हैं, लेकिन मुझे रूपांतरण त्रुटियाँ मिल रही हैं।

const std :: string & string (): यह रूट उस स्ट्रिंग की एक प्रति लौटाता है जिसके साथ पथ व्याकरण के नियमों के अनुसार प्रारूपण के साथ पथ को आरंभीकृत किया गया था।

( यहां पाया गया )

मैंने कोशिश की है:

string result1 = string& (myPath);

और कुछ अन्य बदलाव।

जवाबों:


164

आपको बस कॉल करने की आवश्यकता है myPath.string()


1
वहाँ गारंटी है कि स्ट्रिंग सभी प्लेटफार्मों पर utf8 एन्कोडेड पथ देता है?
सेर्गेई शमबीर

1
@SergeyShambir: दुर्भाग्य से नहीं। एक स्पष्ट रूप से उपयोग कर सकते हैं u8string(), लेकिन यह मदद नहीं करता है जहां string()स्वचालित रूप से उपयोग किया जाता है।
चीयर्स एंड हीथ। - अल्फ

13

मैं तुम्हें एक छोटे से बस की तुलना में अधिक कर एक स्ट्रिंग के लिए पथ बदलने की आवश्यकता का मानना है - कोई प्रतीकात्मक लिंक तत्वों के साथ एक पूर्ण पथ - - आप पहली पथ का प्रामाणिक संस्करण प्राप्त करना चाहिए और परिवर्तित कि एक स्ट्रिंग में:

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

पीएस - मैं उम्र के लिए बूस्ट के साथ प्रोग्रामिंग कर रहा हूं और मुझे यह जानकारी डॉक्स में आसानी से नहीं मिली।


अपडेट (अक्टूबर 2017)

प्रलेखन: बढ़ावा :: filesystem :: विहित

लेकिन ध्यान दें कि C ++ 17 में std :: filesystem है , जिसमें विहित और बहुत कुछ है।


स्वीकृत उत्तर एक बहुत सरल विकल्प है (और यह काम करता है)
alestanis

4
विहित बूस्ट के नए संस्करण में हटा दिया गया है boost.org/doc/libs/1_48_0/libs/filesystem/v3/doc/...
ब्रायन जैक

1
@BriJack हुह, यह कैसे पदावनत है? Sry, कोई आधिकारिक नोट नहीं पा रहा है ... 1.60 संदर्भ भी देखें: boost.org/doc/libs/1_60_0/libs/filesystem/doc/…
Marco Alka

@MarcoAlka लिंक की गई तालिका बूस्ट देखें। Http://doc/libs/1_48_0/libs/filesystem/v3/ doc/… और दूसरी पंक्ति पर ध्यान दें: क्लास पाथ कैनोनीज़ () फ़ंक्शन हटा दिया गया है अर्थात इसका उपयोग पुस्तकालय में एक बार हुआ था लेकिन अब नहीं है - पदावनत की परिभाषा।
ब्रायन जैक

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...      
}

1

कॉलिंग myPath.generic_string()वही करेगी जो आपको चाहिए।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.