2012-09-28 19 views
24

मेरी वर्तमान कार्य निर्देशिका /home/myuser/program पर स्थित है, मैंने boost::filesystem::path ऑब्जेक्ट को इंगित किया है। मैंने /../somedir जोड़ा है इसलिए यह /home/myuser/program/../somedir बन जाता है। लेकिन मुझे इसका हल पूर्ण पथ प्राप्त करने की आवश्यकता है, जो /home/myuser/somedir होगा।बूस्ट :: फाइल सिस्टम के साथ पूर्ण पथ प्राप्त करें :: पथ

मैं लंबे समय से प्रयास कर रहा हूं और मुझे ऐसा करने के लिए their reference में कोई विधि नहीं मिली है। make_absolute नामक एक विधि है, जो मुझे लगता है कि ऐसा करने के लिए प्रतीत होता है, लेकिन मुझे इसे "रूट" पथ तर्क देना होगा। यह कौन सा होना चाहिए? क्या मुझे वास्तविक पूर्ण पथ प्राप्त करने के लिए वास्तव में ऐसा करने की ज़रूरत है? क्या कोई और तरीका है?

उत्तर

21

आप कहते हैं कि आप एक पूर्ण पथ चाहते हैं, लेकिन आपका उदाहरण दिखाता है कि आपके पास पहले से ही एक पूर्ण पथ है। पथ के .. घटकों को हटाने की प्रक्रिया को कैनोलिकलाइजेशन के रूप में जाना जाता है। इसके लिए, आपको canonical पर कॉल करना चाहिए। यह absolute का कार्य भी करने के लिए होता है, इसलिए आपको पहले absolute या make_absolute पर कॉल करने की आवश्यकता नहीं है। make_absolute फ़ंक्शन को मूल पथ की आवश्यकता है; यदि आपके पास कुछ भी बेहतर नहीं है तो आप इसे current_path() पास कर सकते हैं।

+0

exatcly। मैं "कैनोनिकल" शब्द का उपयोग नहीं करना चाहता था क्योंकि मुझे यकीन नहीं था कि इसका मतलब हल सिम्लिंक और ऐसे उदाहरण के लिए भी है। मैंने आपके सुझाव की कोशिश की और यह तुरंत काम किया। धन्यवाद। – Mario

+3

ध्यान दें कि फ़ाइल मौजूद नहीं है तो कैननिकल अपवाद फेंकता है। तो आप केवल मौजूदा पथ का निर्माण कर सकते हैं। –

1

documentation shows कि make_absolute एक वैकल्पिक दूसरा पैरामीटर है कि अपने वर्तमान पथ पर चूक:

path absolute(const path& p, const path& base=current_path());

दूसरा पैरामीटर के बिना यह प्रयास करें और देखें अगर यह परिणाम आप देख रहे हैं रिटर्न ।

+0

यह उन असंगतताओं में से एक है जो मुझे दस्तावेज़ों में थोड़ा परेशान करते थे। एक 'make_absolute' विधि है जिसमें एक पैरामीटर होता है, जब मैं लिंक का पालन करता हूं, तो यह मुझे' पूर्ण() 'फ़ंक्शन के दस्तावेज़ में निर्देशित करता है जो दो मानकों को स्वीकार करता है। फिर भी, इसे 'पूर्ण (pathObject) .string()' की तरह करना एक ही अनसुलझा पथ लौटाएगा। यह वही है जो आपने सुझाव दिया, है ना? – Mario

0

मुझे इसे "रूट" पथ तर्क देना है।

Check the docs: तुम नहीं यह कुछ भी देने के लिए है; यह एक डिफ़ॉल्ट दूसरा पैरामीटर है। अर्थात्, वर्तमान निर्देशिका।

संबंधित पथ कुछ निर्देशिका के सापेक्ष हैं। इस प्रकार, जब पथ को पूर्ण बनाते हैं, तो आपको यह जानना होगा कि यह से संबंधित पूर्ण होना चाहिए। यह "रूट पथ" है: निर्देशिका जो इसके सापेक्ष है।

9

अद्यतन, के बाद से यह अभी भी गूगल के शीर्ष निरपेक्ष पथ के विषय में हिट हो गया लगता है:

बूस्ट 1.57 के रूप में, पहले से सुझाव दिया कार्यों में से कुछ के बाद से हटा दिया गया है।

समाधान है कि मेरे लिए काम किया गया था

boost::filesystem::path canonicalPath = boost::filesystem::canonical(previousPath, relativeTo); 

(बिना आधार के विधि canonical(), बढ़ावा/फाइल सिस्टम/operations.hpp में परिभाषित किया गया है, जो स्वचालित रूप से बढ़ावा/filesystem.hpp के माध्यम से शामिल किया गया है का उपयोग करके)

महत्वपूर्ण: उस पथ पर कैननिकल कॉल करना जो मौजूद नहीं है (उदाहरण के लिए, आप एक फाइल बनाना चाहते हैं) एक अपवाद फेंक देगा। उस स्थिति में, आपकी अगली सबसे अच्छी शर्त शायद बूस्ट :: फाइल सिस्टम :: पूर्ण() है। यह गैर-मौजूदा पथों के लिए भी काम करेगा, लेकिन पथ के बीच में बिंदुओं से छुटकारा नहीं पाएगा (जैसा कि/b/c /../../ d.txt में)। नोट: सुनिश्चित करें कि रिश्तेदार एक निर्देशिका को संदर्भित करता है, फ़ाइलों को संदर्भित पथों पर parent_path() को कॉल करता है (उदा।खुली फ़ाइल जिसमें एक निर्देशिका या फ़ाइल पथ स्वयं से संबंधित है)।

+0

"पिछलापाथ" और "रिश्तेदार" का उदाहरण पथ स्ट्रिंग क्या है? मैं पथ शैली के संदर्भ में इनपुट की तरह दिखने की ज़रूरत नहीं है। –

+0

पिछला पथ पथ ("../../ readme.txt") जैसे सापेक्ष To = path ("c:/example/test/blah") के साथ कुछ "c:/example/readme" को हल करना चाहिए। टेक्स्ट"। यह सुनिश्चित नहीं है कि रिश्तेदार क्या करता है (या यदि एक समझदार इनपुट भी आवश्यक है), यदि पिछले पथ पहले से ही पूर्ण है। – Daniel

संबंधित मुद्दे