ফাইলের নাম থেকে ডিরেক্টরি নাম পাওয়া


85

আমার একটি ফাইলের নাম রয়েছে (সি: \ ফোল্ডার \ foo.txt) এবং আমাকে পরিচালনা না করা সি ++ এ ফোল্ডারটির নাম (সি: \ ফোল্ডার) পুনরুদ্ধার করতে হবে। সি # তে আমি এরকম কিছু করব:

string folder = new FileInfo("C:\folder\foo.txt").DirectoryName;

ফাইল-নেম থেকে পথটি নিষ্কাশন করতে এমন কোনও ফাংশন রয়েছে যা নিয়ন্ত্রণহীন সি ++ এ ব্যবহার করা যেতে পারে?

উত্তর:


20

এর জন্য একটি স্ট্যান্ডার্ড উইন্ডোজ ফাংশন রয়েছে, প্যাথ্রোমোভফিলস্পেক । আপনি যদি কেবল উইন্ডোজ 8 এবং তারপরে সমর্থন করেন তবে পরিবর্তে PathCchRemoveFileSpec ব্যবহার করার পরামর্শ দেওয়া হচ্ছে । অন্যান্য উন্নতির মধ্যে এটি আর MAX_PATH(260) অক্ষরের মধ্যে সীমাবদ্ধ নয়।


4
মনে রাখবেন যে এই ফাংশনটি এখন অবচয় করা হয়েছে। মাইক্রোসফ্ট থেকে দেওয়া পরামর্শটি পরিবর্তে প্যাথচ্রেরমোভফিলস্পেক ব্যবহার করা উচিত।
ডিফল্ট

4
@ ডিফল্ট: পাথচ্যাচারমোভফিলস্পেক কেবল উইন্ডোজ ৮ দিয়ে শুরু হবে যা উইন্ডোজ ভিস্তা এবং still টি এখনও সমর্থিত, তাই পাঠথ্রোমোভফিলস্পেক
IInspectable

154

বুস্ট.ফাইল সিস্টেম ব্যবহার:

boost::filesystem::path p("C:\\folder\\foo.txt");
boost::filesystem::path dir = p.parent_path();

4
p.remove_filename()pজায়গায় স্থান পরিবর্তন করবে , এবং এর চেয়ে আরও দক্ষতার সাথে প্রয়োগ করা যেতে পারেp = p.parent_path()
পিটার কর্ডেস

আপনার কাছে নিয়ে কারবার হতে পারে তবে ডিরেক্টরি সত্য যে সচেতন হতে parent_path()থেকে "C:\\folder"পরিণাম ডেকে আনবে "C:"
সেমজান ম্যাসিংগার

প্রচুর বুস্ট স্ট্যান্ডে আপগ্রেড হয় তাই এটি চেষ্টা করে দেখুন .... অন্তর্ভুক্ত <ফাইলসিসটেম> .... স্টাড :: পরীক্ষামূলক :: ফাইল সিস্টেম :: পাথ পি ("সি: \\ ফোল্ডার \\ foo.txt");
এস মেইডেন

72

Http://www.cplusplus.com/references/string/string/find_last_of/ এর উদাহরণ

// string::find_last_of
#include <iostream>
#include <string>
using namespace std;

void SplitFilename (const string& str)
{
  size_t found;
  cout << "Splitting: " << str << endl;
  found=str.find_last_of("/\\");
  cout << " folder: " << str.substr(0,found) << endl;
  cout << " file: " << str.substr(found+1) << endl;
}

int main ()
{
  string str1 ("/usr/bin/man");
  string str2 ("c:\\windows\\winhelp.exe");

  SplitFilename (str1);
  SplitFilename (str2);

  return 0;
}

4
এটি এখানে সেরা সর্বনিম্ন সমাধান solution
প্লাজম্যাসেল

42

সি ++ 17 std::filesystem::pathএ পদ্ধতিটি ব্যবহার করে একটি শ্রেণি বিদ্যমান parent_path

#include <iostream>
#include <filesystem>
namespace fs = std::filesystem;
int main()
{
    for(fs::path p : {"/var/tmp/example.txt", "/", "/var/tmp/."})
        std::cout << "The parent path of " << p
                  << " is " << p.parent_path() << '\n';
}

সম্ভাব্য আউটপুট:

The parent path of "/var/tmp/example.txt" is "/var/tmp"
The parent path of "/" is ""
The parent path of "/var/tmp/." is "/var/tmp"

4
একটি .remove_filename()পদ্ধতিও বিদ্যমান ।
কিউকিউই

4
ধন্যবাদ, @ কিউকিউ, উত্তর থেকে প্রাপ্ত পদ্ধতির বিপরীতে সঠিক এবং প্রত্যাশিত ফলাফল পেতে এটি সেই পদ্ধতির সাথে ডিরেক্টরি পথটি ব্যবহার করার অনুমতি দেয়
হেরগোট

13

কেন এত জটিল হতে হবে?

#include <windows.h>

int main(int argc, char** argv)         // argv[0] = C:\dev\test.exe
{
    char *p = strrchr(argv[0], '\\');
    if(p) p[0] = 0;

    printf(argv[0]);                    // argv[0] = C:\dev
}

10
এটি পোর্টেবল নয়। লিনাক্সের পাথ বিভাজক '/'। std :: ফাইল সিস্টেম :: পাথ স্ট্যান্ডার্ড এবং পোর্টেবল।
রুমি

7
 auto p = boost::filesystem::path("test/folder/file.txt");
 std::cout << p.parent_path() << '\n';             // test/folder
 std::cout << p.parent_path().filename() << '\n';  // folder
 std::cout << p.filename() << '\n';                // file.txt

p.parent_path().filename()প্যারেন্ট ফোল্ডারের নাম পেতে আপনার প্রয়োজন হতে পারে ।


5

বুস্ট :: ফাইল সিস্টেম ব্যবহার করুন। এটি যাইহোক যাইহোক পরবর্তী স্ট্যান্ডার্ডের সাথে সংযুক্ত করা হবে যাতে আপনি এটির অভ্যস্তও হতে পারেন।


4
আপনি কোন স্ট্যান্ডার্ডের কথা বলছেন? আমি জানি যে বুস্ট থেকে প্রচুর জিনিস সি ++ স্ট্যাড লাইবে যুক্ত হয়েছিল, ফাইল সিস্টেমও যুক্ত হবে?
ম্যাকলারি

7
"এটি যাইহোক যাইহোক পরবর্তী মান হিসাবে সংহত করা হবে" এবং এটি নয়
আন্তন কে

@ অ্যানটোনকে হয়তো সি ++ 2017?
আলেসান্দ্রো জ্যাকপসন



1

আমি এত অবাক হয়েছি যে কেউ পিক্সিতে স্ট্যান্ডার্ড পন্থা উল্লেখ করেনি

basename / dirnameকনস্ট্রাক্টস ব্যবহার করুন ।

ম্যান বেসনেম


4
পসিক্স ফাংশনগুলি তাদের ত্রুটিগুলি ছাড়াই নয়। বিশেষত তারা আপনাকে যে বাফারটি পাস করবে তা সংশোধন করতে পারে (তাদের সত্যিকার অর্থে স্বাক্ষরটি হ'ল basname(char * path)এবং না basename(const char * path)), এবং বাস্তবায়নগুলি না করে এমন একটি স্ট্যাটিক বাফার ব্যবহার করতে হবে যা তাদের থ্রেড-অনিরাপদ করে তোলে (নীতিগতভাবে আপনি পরিবর্তনশীলভাবে বরাদ্দকৃত ফলাফলগুলিও ফিরে আসতে পারে, তবে এটি আপনাকে allocপারিবারিক ফাংশনের উপর নির্ভরশীল করে তোলে যা সি ++ এ বিশ্রী।
ডিএমকেকে --- প্রাক্তন-মডারেটর বিড়ালছানা

-1

স্ট্যান্ডার্ড সি ++ এ ক্ষেত্রে আপনার পক্ষে বেশি কিছু করবে না, কারণ পথের নাম প্ল্যাটফর্ম-নির্দিষ্ট। আপনি নিজে স্ট্রিং বিশ্লেষণ করতে পারেন (glowcoder এর উত্তরে হিসাবে), ব্যবহার অপারেটিং সিস্টেম সুবিধা (যেমন http://msdn.microsoft.com/en-us/library/aa364232(v=VS.85).aspx ), অথবা সম্ভবত সেরা পদ্ধতির, আপনি বুস্ট :: ফাইল সিস্টেমের মতো একটি তৃতীয় পক্ষের ফাইল সিস্টেম লাইব্রেরি ব্যবহার করতে পারেন।


স্ট্যান্ডার্ডের সি ++ ১ জেড বর্তমানে সমস্যা সমাধানের চেয়ে প্ল্যাটফর্ম-বন্ধুত্বপূর্ণ করার কারণে বুস্ট ফাইল সিস্টেম লাইব্রেরি গ্রহণ করার চেষ্টা করছে। এটি এখনও এমএসভিসির জন্য পরীক্ষামূলক শিরোনামে রয়েছে।
kayleeFrye_onDeck

-6

কেবল এটি ব্যবহার করুন: এক্সট্রাক্টফিলিপথ (আপনার_পথ_ফাইলে_নাম)


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