পৃথক স্ট্রিং থেকে কীভাবে একটি পূর্ণ পাথ স্ট্রিং (নিরাপদে) তৈরি করবেন?


91

সি ++ এর কি পাইথনের ফাংশনের সমতুল্য os.path.join? মূলত, আমি এমন কিছু সন্ধান করছি যা একটি ফাইল পাথের দুটি (বা আরও) অংশ একত্রিত করে যাতে দুটি অংশ পুরোপুরি এক হয়ে যায় কিনা তা নিশ্চিত করার জন্য আপনাকে উদ্বিগ্ন হওয়ার দরকার নেই। যদি এটি Qt এ থাকে তবে এটিও দুর্দান্ত।

মূলত আমি কিছু কোড ডিবাগ করার জন্য এক ঘন্টা ব্যয় করেছি এবং এর কমপক্ষে কিছু অংশ হ'ল কারণটি root + filenameছিল root/ + filenameএবং আমি ভবিষ্যতে এটি এড়াতে চাই।


সম্ভবত দূরবর্তীভাবে সম্পর্কিত: স্ট্যাকওভারফ্লো / প্রশ্নগুলি / 777777২৯৯২ / ২ (বিশেষত, সেই প্রশ্নের সাথে সম্পর্কিত উত্সাহ দেওয়া complete)
অরবিট

উত্তর:


45

এর জন্য কিউডির পরীক্ষা করে দেখুন :

QString path = QDir(dirPath).filePath(fileName);

4
সতর্কতা অবলম্বন করুন যে কিউটিটি জিপিএল। অনেকগুলি ব্যবহারের জন্য ডিল ব্রেকার হতে পারে।
rustyx

4
@ রাস্টিকএক্স এটি সঠিকভাবে বলা, এটি এলজিপিএল।
Pa_

99

কেবল বুস্ট.ফাইল সিস্টেম লাইব্রেরির অংশ হিসাবে । এখানে একটি উদাহরণ:

#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

4
এটি টিআর 2 তেও রয়েছে, যা পরের বছর সংকলকগুলির সাথে শিপিং শুরু করবে।
iljarn

4
@ ভ্ল্যাড: হ্যাঁ, এটি সহজে আবিষ্কারযোগ্য নয়, তবে আমি বুস্ট ডক লিঙ্কগুলিতে ক্লিক করা ঘৃণা করি এবং নির্দ্বিধায় বুঝতে পারি যে আমি একটি পুরানো সংস্করণটি দেখছি, তাই আমি যখন লোকগুলির সংস্করণ-নির্দিষ্ট লিঙ্কগুলি সন্নিবেশ করি তখন সম্পাদনা করি। :
পি

4
@ এল্ডজার্ন: যা এখন দুর্দান্ত কাজ করছে বলে মনে হচ্ছে ... তবে প্রদত্ত লাইব্রেরির জন্য সাইট বা ডক্স সম্পর্কে তারা কিছু পরিবর্তন না করা পর্যন্ত অপেক্ষা করুন। এটি তখন থেকে সংস্করণ-নির্দিষ্ট লিঙ্কটি ছেড়ে দেওয়ার চেয়ে খারাপ।
ফ্রেড নুরক

4
@ ফ্রেড: স্পষ্টত যদি কার্যকারিতা বা প্রশ্নটি সংস্করণ-নির্দিষ্ট হয়ে থাকে তবে আমি ইউআরএল পরিবর্তন করি না। এই ক্ষেত্রে, এটি না, তাই আমি করেছি।
iljarn

4
@ildjarn: আপনি কীভাবে ভবিষ্যদ্বাণী করবেন যে প্রদত্ত গ্রন্থাগার ভবিষ্যতে কী পরিবর্তন হবে যাতে আপনি জানতে পারবেন যে আপনার সম্পাদনা করা সমস্ত উত্তর ভবিষ্যতের সংস্করণগুলির জন্য অর্থবোধ করে কিনা?
ফ্রেড নুরক

24

অনুরূপ @ user405725 এর উত্তর (কিন্তু বুস্ট ব্যবহার করছেন না), এবং উল্লেখ @ildjarn একটি মন্তব্যে, এই কার্যকারিতা অংশ হিসাবে পাওয়া যায় এসটিডি :: ফাইলসিস্টেম । নিম্নলিখিত কোডগুলি হোমব্রু জিসিসি 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
সি ++ 17 এর হিসাবে এটি (অ-পরীক্ষামূলক) <ফাইলে সিস্টেম> শিরোনামে একীভূত হয়েছিল। En.cppreferences.com/w/cpp/files systemm দেখুন ।
এলিবি

9

ইউনিক্স / লিনাক্স-এ অন্তত, এটা সবসময় দ্বারা একটি পাথ অংশগুলি যোগদানের জন্য নিরাপদ /, এমনকি যদি পথের কিছু অংশ ইতিমধ্যে শেষ /, অর্থাত্ root/pathসমতূল্য root//path

এই ক্ষেত্রে, আপনার যা যা প্রয়োজন তা হ'ল জিনিসগুলিতে যোগ দেওয়া /। এটি বলেছিল, আমি অন্যান্য উত্তরের সাথে একমত যে boost::filesystemএটি যদি আপনার কাছে উপলব্ধ হয় তবে এটি একটি ভাল পছন্দ কারণ এটি একাধিক প্ল্যাটফর্ম সমর্থন করে।


4
কিউটি পাথ বিভাজকের অজানা। আপনি যদি উইন্ডোজে কোনও ফাইলের পরম পাথটি মুদ্রণ করেন তবে / (ইউনিক্স) বিভাজক সহ আউটপুট "সি: / ইউজার / নাম / মাইফাইল.txt" হয়। বুস্ট :: ফাইল সিস্টেমটি দুর্দান্ত তবে, আমার মতে, প্রকল্পটি যদি Qt- ভিত্তিক হয় তবে বুস্ট লাইব্রেরির জন্য নির্ভরশীল যুক্ত করার দরকার নেই।
LoSciamano

7

আপনি যদি Qt দিয়ে এটি করতে চান তবে আপনি QFileInfoকনস্ট্রাক্টর ব্যবহার করতে পারেন :

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

4

সি ++ 11 এবং কিউটি দিয়ে আপনি এটি করতে পারেন:

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

কিউটিতে, /কিউটি এপিআই ( QFile, QFileInfo) ব্যবহার করার সময় কেবল কোড ব্যবহার করুন । এটি সমস্ত প্ল্যাটফর্মে সঠিক কাজ করবে। যদি আপনাকে একটি QT- বিহীন ফাংশনটিতে পাথ দিতে হয়, বা এটি ব্যবহারকারীর কাছে প্রদর্শন করার জন্য এটি ফর্ম্যাট করতে চান, QDir:toNativeSeparators()উদাহরণস্বরূপ:

QDir::toNativeSeparators( path );

এটি /দেশীয় সমতুল্য (যেমন \উইন্ডোজে) দ্বারা প্রতিস্থাপন করবে । অন্য দিক দিয়ে হয় QDir::fromNativeSeparators()

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.