বুস্ট পাথ টাইপকে স্ট্রিংয়ে কীভাবে রূপান্তর করবেন?


127

হ্যালো আমার কাছে বর্তমানে একটি প্রোগ্রাম রয়েছে যা কোনও ফাইলের অবস্থানের পুরো পাথ পায় এবং একটি ভেরিয়েবলের মধ্যে রাখা হয় যা টাইপ: বুস্ট :: ফাইলসিস্টেম 2 :: পাথ

আমি কীভাবে এটি করব তা সন্ধান করেছি এবং এটি ব্যবহার করে দেখতে পেয়েছি:

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

পাথটি স্ট্রিংয়ে রূপান্তরিত করবে তবে এটি কেবল ফাইলের নাম রূপান্তর করে (উদাহরণস্বরূপ, যদি পথটি "সি: \ নাম \ ববসআউইউইন ওয়ার্ডডোক.ডোক্স" হয় তবে এটি কেবল "ববসআউজওয়্যার ওয়ার্ডডোক" ফিরিয়ে দেয়)।

পুরো পথটিকে স্ট্রিংয়ে কীভাবে রূপান্তর করা যায় সে সম্পর্কে আমি নিম্নলিখিতটি পেয়েছি, তবে কীভাবে এটি আমার প্রোগ্রামে প্রয়োগ করতে হয় তা আমি জানি না। আমি একাধিক উপায়ে চেষ্টা করেছি তবে রূপান্তর ত্রুটি পাচ্ছি।

কনস্ট স্টাড :: স্ট্রিং এবং স্ট্রিং (): এই রুটিনটি স্ট্রিংয়ের একটি অনুলিপি প্রদান করে যার সাথে পথটি আরম্ভ করা হয়েছিল, সেই সাথে পাথ ব্যাকরণ নিয়ম অনুসারে ফর্ম্যাট করে।

( এখানে পাওয়া )

আমি চেষ্টা করেছি:

string result1 = string& (myPath);

এবং কয়েকটি অন্যান্য প্রকরণ।

উত্তর:


164

আপনি শুধু ফোন করতে হবে myPath.string()


1
গ্যারান্টিজ রয়েছে যে স্ট্রিংটি সমস্ত প্ল্যাটফর্মগুলিতে utf8 এনকোডযুক্ত পথটি দেয়?
সের্গেই শাম্বির

1
@ সার্জি শাম্বির: দুর্ভাগ্যক্রমে নয় not একটি সুস্পষ্টভাবে ব্যবহার করতে পারে u8string(), তবে এটি string()স্বয়ংক্রিয়ভাবে কোথায় ব্যবহৃত হয় তা সাহায্য করে না ।
চিয়ার্স এবং এইচটিএইচ - আলফ

13

আমি তোমাকে একটা সামান্য মাত্র বেশী কি একটি স্ট্রিং পাথ রূপান্তর করতে হবে বিশ্বাস - কোনো প্রতীকী-লিঙ্ক উপাদানের সঙ্গে একটি সুনির্দিষ্ট পাথ - - আপনাকে প্রথমে পথের ক্যানোনিকাল সংস্করণ প্রাপ্ত উচিত এবং ধর্মান্তরিত যে একটি স্ট্রিং মধ্যে:

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

পিএস - আমি বুস্টের সাথে যুগ যুগ ধরে প্রোগ্রামিং করে চলেছি এবং দস্তাবেজে খুব সহজেই এই তথ্যটি খুঁজে পেলাম না।


আপডেট (অক্টোবর 2017)

ডকুমেন্টেশন: বুস্ট :: ফাইল সিস্টেম :: ক্যানোনিকাল

কিন্তু মনে রাখবেন যে C- এর ++ -এর 17 সেখানে হয় std :: ফাইলসিস্টেম সঙ্গে ক্যানোনিকাল এবং আরো অনেক।


গৃহীত উত্তরটি অনেক সহজ বিকল্প (এবং এটি কার্যকর)
alestanis


1
@ ব্রায়ান জ্যাক হু, এটি কীভাবে অবহেলিত? শুভ, কোনও সরকারী নোট খুঁজে পাওয়া যায় না ... আরও দেখুন 1.60 রেফারেন্স: boost.org/doc/libs/1_60_0/libs/filesystem/doc/…
মার্কো আলকা

@ মারকোআলকা সংযুক্ত টেবিলটি দেখুন boost.org/doc/libs/1_48_0/libs/files system/v3/ doc/… এবং দ্বিতীয় লাইনটি নোট করুন: শ্রেণীর পাথ ক্যানোনাইজ () ফাংশন সরানো হয়েছে - এর অর্থ এটি লাইব্রেরিতে একবার ছিল তবে আর থাকবে না - হ্রাসের সংজ্ঞা।
ব্রায়ান জ্যাক

2
@ ব্রায়ান জ্যাক এটি হ'ল canonizeআপনার দ্বিতীয় লিঙ্ক অনুসারে, এটি হ্রাস পেয়েছে , তবে canonicalমনে হয় না (আপনার প্রথম লিঙ্কটি প্রতি 1_48 ভি 3 এর জন্য)। এখন সি ++ 17 এ std::filesystemঅবশ্যই আমাদের আছে
zdim

3

এটি ডাব্লুএক্সজেটগুলিতে কাজ করেছে: (আমি জানি আমার কেবল ডাব্লুএক্স ইউটিলিটি ব্যবহার করা উচিত তবে এটি একটি পরীক্ষা)

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()আপনার যা প্রয়োজন তা করবে।


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