अलग-अलग तारों से पूर्ण पथ स्ट्रिंग (सुरक्षित रूप से) का निर्माण कैसे करें?


91

क्या C ++ अजगर के कार्य के बराबर है os.path.join? असल में, मैं एक ऐसी चीज की तलाश में हूं, जो फाइल पथ के दो (या अधिक) भागों को जोड़ती है ताकि आपको यह सुनिश्चित करने के बारे में चिंता न हो कि दोनों भाग पूरी तरह से एक साथ फिट होते हैं। यदि यह Qt में है, तो यह भी अच्छा होगा।

मूल रूप से मैंने कुछ कोड डिबगिंग में एक घंटा बिताया और इसका कम से कम हिस्सा इसलिए था क्योंकि root + filenameमुझे होना था root/ + filename, और मैं भविष्य में इससे बचना चाहता हूं।


संभवतः दूर से संबंधित: stackoverflow.com/questions/5772992/… (विशेष रूप से, उस प्रश्न से संबंधित है बढ़ावा देने के complete)
को ऑर्बिट

जवाबों:



98

केवल Boost.Filesystem पुस्तकालय के हिस्से के रूप में । यहाँ एक उदाहरण है:

#include <iostream>
#include <boost/filesystem.hpp>

namespace fs = boost::filesystem;

int main ()
{
    fs::path dir ("/tmp");
    fs::path file ("foo.txt");
    fs::path full_path = dir / file;
    std::cout << full_path << std::endl;
    return 0;
}

यहाँ संकलन और चलाने का एक उदाहरण है (प्लेटफ़ॉर्म विशिष्ट):

$ g++ ./test.cpp -o test -lboost_filesystem -lboost_system
$ ./test 
/tmp/foo.txt

1
यह टीआर 2 में भी है, जो अगले साल संकलक के साथ शिपिंग शुरू करने की संभावना है।
०१:०१

1
@ व्लाद: हाँ, यह आसानी से पता नहीं चल सकता है, लेकिन मुझे बूस्ट डॉक्स लिंक्स पर क्लिक करने से घृणा है और मैं यह महसूस करता हूं कि मैं एक पुराने संस्करण को देख रहा हूं, इसलिए मैं लोगों के संस्करण-विशिष्ट लिंक को संपादित करता हूं, जब मैं उनके पार आता हूं। :-P
ildjarn

1
@ गिल्डरन: जो अब बहुत अच्छा काम कर रहा है ... लेकिन जब तक वे साइट या डॉक्स के बारे में कुछ नहीं बदलते, तब तक प्रतीक्षा करें। यह तब से संस्करण-विशिष्ट लिंक को छोड़ने से भी बदतर है।
फ्रेड नर्क

1
@ पसंदीदा: जाहिर है कि कार्यक्षमता या प्रश्न संस्करण-विशिष्ट होने के कारण, मैं URL नहीं बदलता। इस मामले में, ऐसा नहीं है, इसलिए मैंने किया।
०१ild:०१

1
@ गिल्डरन: आप कैसे भविष्यवाणी करते हैं कि भविष्य में दी गई लाइब्रेरी क्या बदलेगी ताकि आप जान सकें कि क्या आपके द्वारा संपादित सभी उत्तर भविष्य के सभी संस्करणों के लिए समझ में आएंगे?
फ्रेड नर्क

24

करने के लिए इसी तरह के @ user405725 के जवाब (लेकिन बढ़ावा का उपयोग नहीं), और ने उल्लेख किया @ildjarn एक टिप्पणी में, इस कार्यशीलता के हिस्से के रूप में उपलब्ध है std :: फाइल सिस्टम । निम्नलिखित कोड Homebrew GCC 9.2.0_1 का उपयोग करके और ध्वज का उपयोग करने के लिए संकलित करता है --std=c++17:

#include <iostream>
#include <filesystem>
namespace fs = std::filesystem;

int main() 
{
    fs::path dir ("/tmp");
    fs::path file ("foo.txt");
    fs::path full_path = dir / file;
    std::cout << full_path << std::endl;
    return 0;
}

4
C ++ 17 के अनुसार, इसे (गैर-प्रायोगिक) <filesystem> शीर्ष लेख में मिला दिया गया था। En.cppreference.com/w/cpp/filesystem देखें ।
Eli_B

9

कम से कम यूनिक्स / लिनक्स में, पथ के /कुछ हिस्सों से जुड़ना हमेशा सुरक्षित होता है , भले ही रास्ते के कुछ हिस्से पहले से ही समाप्त हों /, यानी root/pathके बराबर root//path

इस मामले में, आप सभी को वास्तव में चीजों को शामिल करने की आवश्यकता है /। उस ने कहा, मैं अन्य उत्तरों से सहमत हूं जो boost::filesystemएक अच्छा विकल्प है यदि यह आपके लिए उपलब्ध है क्योंकि यह कई प्लेटफार्मों का समर्थन करता है।


2
क्यूटी पथ विभाजक के लिए अज्ञेय है। यदि आप विंडोज पर किसी फाइल का निरपेक्ष पथ प्रिंट करते हैं, तो आउटपुट (C) / (Unix) विभाजक के साथ "C: /User/Name/MyFile.txt" है। बढ़ावा देना :: फाइलसिस्टम महान है, लेकिन मेरी राय में, अगर परियोजना क्यूटी-आधारित है, तो बढ़ावा पुस्तकालय के लिए एक भरोसेमंद जोड़ने की कोई आवश्यकता नहीं है।
LoSciamano

7

यदि आप Qt के साथ ऐसा करना चाहते हैं, तो आप QFileInfoकंस्ट्रक्टर का उपयोग कर सकते हैं :

QFileInfo fi( QDir("/tmp"), "file" );
QString path = fi.absoluteFilePath();

4

C ++ 11 और Qt के साथ आप यह कर सकते हैं:

QString join(const QString& v) {
    return v;
}

template<typename... Args>
QString join(const QString& first, Args... args) {
    return QDir(first).filePath(join(args...));
}

उपयोग:

QString path = join("/tmp", "dir", "file"); // /tmp/dir/file

3

Qt में, /Qt API ( QFile, QFileInfo) का उपयोग करते समय बस कोड का उपयोग करें । यह सभी प्लेटफार्मों पर सही काम करेगा। यदि आपको एक गैर-क्यूटी फ़ंक्शन के लिए एक मार्ग पारित करना है, या इसे उपयोगकर्ता को प्रदर्शित करने के लिए प्रारूपित करना चाहते हैं, QDir:toNativeSeparators()उदाहरण के लिए:

QDir::toNativeSeparators( path );

यह /मूल समकक्ष (यानी \विंडोज पर) से बदल देगा। दूसरी दिशा के माध्यम से किया जाता है QDir::fromNativeSeparators()

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