সি # তে আমি কীভাবে প্যারেন্ট ডিরেক্টরিটি পাই?


86

আমি এই কোডটি ডিবাগ ডিরেক্টরি সন্ধানের জন্য ব্যবহার করি

public string str_directory = Environment.CurrentDirectory.ToString();

"C:\\Users\\Masoud\\Documents\\Visual Studio 2008\\Projects\\MyProj\\MyProj\\bin\\Debug"

নীচের চিত্রের মতো আমি প্যারেন্ট ফোল্ডারটি কীভাবে খুঁজে পেতে পারি?

"C:\\Users\\Masoud\\Documents\\Visual Studio 2008\\Projects\\MyProj\\MyProj"


16
লোকেরা কেন সবসময় স্ট্রিংগুলিতে টসস্ট্রিং () ব্যবহার করে?
হোগান

4
@ হোগান, সম্পত্তি পরিবর্তন হলে? : ডি
মিউজফ্যান

উত্তর:


128

আপনি System.IO.Directory.GetParent()প্রদত্ত ডিরেক্টরিটির মূল ডিরেক্টরি পুনরুদ্ধার করতে ব্যবহার করতে পারেন ।


23
ডিরেক্টরিটিতে যদি পিছনে পিছনে স্ল্যাশ থাকে, আপনাকে গেটপেন্টকে দু'বার কল করতে হবে
উত্তরবেন

4
এটি আপেক্ষিক পথে (খুশির অবাক) কাজ করে বলে মনে হচ্ছে তবে এরপরে ফল ফিরে পাওয়ার কোনও উপায় আপনার কাছে নেই (অসন্তুষ্ট অবাক)।
আদম

15
পরিবর্তে ব্যবহার করে আপনি পিছনে স্ল্যাশ সমস্যা এড়াতে পারবেন DirectoryInfo.Parent। যেমন new System.IO.DirectoryInfo("c:/path/to/somewhere//").Parent। @ নর্থথেন
এমসিএনক্স


35

আপনি যদি ..\..আপনার বিদ্যমান পথে যুক্ত হন তবে অপারেটিং সিস্টেমটি গ্র্যান্ড-প্যারেন্ট ফোল্ডারটি সঠিকভাবে ব্রাউজ করবে।

এটি কাজ করা উচিত:

System.IO.Path.Combine("C:\\Users\\Masoud\\Documents\\Visual Studio 2008\\Projects\\MyProj\\MyProj\\bin\\Debug", @"..\..");

আপনি যদি সেই পথটি ব্রাউজ করেন তবে আপনি গ্র্যান্ড-প্যারেন্ট ডিরেক্টরিটি ব্রাউজ করবেন।


4
এটি দেখতে দুর্দান্ত লাগছে, তবে দুর্ভাগ্যক্রমে সি: \ ব্যবহারকারীগণ \ মাসউদ \ নথিগুলি \ ভিজ্যুয়াল স্টুডিও ২০০\ \ প্রকল্পগুলি \ মাইপ্রোজ \ মাইপ্রোজ \ বিন \ ডিবাগ \ .. \ ..
স্টুয়ার্টকিউ

হ্যাঁ এবং আপনি যদি সেই পথটি ব্রাউজ করেন তবে আপনি পিতামাতা-পিতামাতার ডিরেক্টরি ব্রাউজ করবেন।
পিয়েরে-আলাইন ভিজিয়েন্ট

যথাযথ বিন্দু, আমি ডাউনটোটটি সরিয়ে ফেলব, যদিও পয়েন্টটি ফেরত দেওয়ার জন্য আমাকে আপনার মন্তব্যে সম্পাদনা করতে হবে।
স্টুয়ার্টকিউ

4
এটি পরিষ্কার করার জন্য "Path.Combine" এর ফলাফলটি "Path.GetFullPath" এর মধ্য দিয়ে যেতে পারে। এটি "সি: \ ব্যবহারকারীগণ \ মাসউদ \ নথিগুলি \ ভিজ্যুয়াল স্টুডিও 2008 \ প্রকল্পগুলি \ মাইপ্রোজ \ মাইপ্রোজ"
কনস্ট্যান্টিন

4
ডিরেক্টরি বৃক্ষের কয়েকটি স্তরে যাওয়ার সর্বোত্তম পন্থা
ট্রুং লে

19

আমি System.IO.Path.Combine(myPath, "..")সহজ এবং সবচেয়ে নির্ভরযোগ্য হতে রূপগুলি খুঁজে পেয়েছি । আরও বেশি, যদি উত্তরবাইন যা বলেন তা সত্য, গেটপেন্টের জন্য একটি অতিরিক্ত কল প্রয়োজন যদি সেখানে একটি পিছনে স্ল্যাশ থাকে। এটি আমার কাছে অবিশ্বাস্য।

পাথ.কোমাইন নিশ্চিত করে যে আপনি কখনও স্ল্যাশ দিয়ে ভুল করবেন না।

..এটি উইন্ডোজের অন্য কোথাও ঠিক তেমন আচরণ করে। আপনি \..সেন্টিমিডি বা এক্সপ্লোরার পথে কোনও সংখ্যক সংখ্যক যোগ করতে পারেন এবং এটি নীচে বর্ণিত হিসাবে ঠিক আচরণ করবে।

কিছু প্রাথমিক ..আচরণ:

  1. যদি কোনও ফাইলের নাম থাকে তবে ..তা কেটে ফেলবে:

Path.Combine(@"D:\Grandparent\Parent\Child.txt", "..") => D:\Grandparent\Parent\

  1. যদি পাথটি ডিরেক্টরি ..হয় তবে একটি স্তরটি উপরে যাবে:

Path.Combine(@"D:\Grandparent\Parent\", "..") => D:\Grandparent\

  1. ..\.. একই নিয়ম অনুসরণ করে, পর পর দুবার:

Path.Combine(@"D:\Grandparent\Parent\Child.txt", @"..\..")=> D:\Grandparent\ Path.Combine(@"D:\Grandparent\Parent\", @"..\..")=>D:\

  1. এবং এটি ঠিক একই প্রভাব আছে:

Path.Combine(@"D:\Grandparent\Parent\Child.txt", "..", "..")=> D:\Grandparent\ Path.Combine(@"D:\Grandparent\Parent\", "..", "..")=>D:\


4
আমি সম্মত হই যে এই পদ্ধতিতে পথ চলার ব্যাকস্ল্যাশ রয়েছে কি না তা কাজ করার সুবিধা রয়েছে। এবং এমন পরিস্থিতিতে যেখানে আপনি বিন্দুবিহীন একটি সরল পথ চান সেখানে আপনি পাথ.গেটফুলপাথ (() ফলাফলটিতে প্রয়োগ করতে পারেন
রেনিপেট

4
দুই বছর পরে এবং আমি আবার এখানে ফিরে পাই। সচেতন থাকুন যে পাথ.গেটফুলপাথ (() সাধারণত কোনও পেছনের ব্যাকস্ল্যাশ ছাড়াই কোনও পথ ফেরায়, তবে যখন আপনি রুট ডিরেক্টরিতে
পৌঁছান

এটি নেট। 4.7 বা। নেট কোর 2.1 এর সাথেও কাজ করে না: Path.Combine(@"D:\Grandparent\Parent\Child.txt", @"..")=D:\Grandparent\Parent\Child.txt\..
মাটুল

এটি আমার জন্য ফাইলের নামটি কাটাবে না, অন্তত ম্যাকএস-এ ইউনিটির মাধ্যমে।
সুপারগ্রা

@ মাটুল @ সুপারগ্রা আমি বিভ্রান্তি দেখছি। Path.Combineস্ট্রিং নিজেই কেটে দেয় না। একবারে ফাইল সিস্টেম অ্যাক্সেস করতে ব্যবহৃত পাথটির উদ্দেশ্যটি কার্যকর। যাইহোক, আমি সম্মত যে এটি suboptimal হয়। পথটি সমাধানের জন্য ফাইল সিস্টেমের পরিবর্তে স্ট্রিংকে পরিবর্তন করে এমন পদ্ধতির জন্য এই পৃষ্ঠায় আমার আরও সাম্প্রতিক উত্তর দেখুন ।
টিমো

11

একটি 'পিতামহী' ডিরেক্টরি পেতে, ডিরেক্টরি কল করুন Gপরিচয় ( দুটি ) পান:

var gparent = Directory.GetParent(Directory.GetParent(str_directory).ToString());

4
var gparent = Directory.GetParent(str_directory).Parent; // Cleaner?
জনবি

8

Directory.GetParentসম্ভবত একটি ভাল উত্তর, কিন্তু সম্পূর্ণতার জন্য একটি ভিন্ন পদ্ধতি যা স্ট্রিং এবং আয় স্ট্রিং লাগে আছে: Path.GetDirectoryName

string parent = System.IO.Path.GetDirectoryName(str_directory);

4
আপনার মাইন্ডের কথা.গেটডাইরেক্টরিনেম আপেক্ষিক পাথের সাথে ভাল কাজ করে না .. ডিরেক্টরি.গেটপ্যারেন্ট করে।
নওফাল

6

এটার মত:

System.IO.DirectoryInfo myDirectory = new DirectoryInfo(Environment.CurrentDirectory);
string parentDirectory = myDirectory.Parent.FullName;

শুভকামনা!


4
myDirectory.Parent.ToString () পুরো ফোল্ডারের পরিবর্তে সাবফোল্ডারের নামটি দেয়, ঠিক আমি যা খুঁজছিলাম। উপরন্তু, ডিরেক্টরি.গেটপ্যারেন্ট (ডিরেক্টরী.গেটপ্যারেন্ট (টিআর_ডাইরেক্টরি) .ToString ()) না করে; উপরে প্রদর্শিত হিসাবে, কেবলমাত্র MyDirectory.parent.parent.ToString () ব্যবহার করে 'পিতামহ' পাওয়া যায়।
ওয়েইহুই গুও

4
আমি এই পদ্ধতিটি সর্বোত্তম খুঁজে পাই কারণ এটি আপনার ডিরেক্টরিতে যে পথটি পিছনে রয়েছে সেখানে হ্রাস পাবে। আপনি যদি ডিরেক্টরী.গেটপ্যারেন্ট () ব্যবহার করেন তবে স্ল্যাশগুলি সরিয়ে ফেলতে এবং তারপরে প্রকৃত পিতামাতার জন্য আপনাকে দুটি বার কল করতে হবে।
ম্যাগনাস


3

Tra সহবর্তী সমস্যাগুলি এড়াতে, এটিকে এখানে কল করুন:

  string ParentFolder =  Directory.GetParent( folder.Trim('\\')).FullName;

4
আপনি TrimEndযদি কেবল ট্রেইলিং সরাতে চান তবে আপনি ব্যবহার করতে পারেন `'s . I'm not sure if a leading other অন্যান্য ওএসের ক্ষেত্রে তাৎপর্যপূর্ণ।
ওয়াল্টার স্ট্যাবস

2

আপনার সমাধান পেতে চেষ্টা করুন

string directory = System.IO.Directory.GetParent(System.IO.Directory.GetParent(Environment.CurrentDirectory).ToString()).ToString();

2

এটি সর্বাধিক প্রচলিত উপায় - এটি আপনি যা করছেন ঠিক তার উপর নির্ভর করে: সুনির্দিষ্ট অবস্থান সন্ধানের জন্য আপনার ডিরেক্টরিগুলির অবস্থান পুনরুদ্ধার করতে সেগুলি ব্যবহার করা উচিত, অন্য কোনও জায়গার সন্ধান এবং এটি সংশোধন করার জন্য নয়))

// remove last 10 characters from a string
str_directory = str_directory.Substring(0,str_directory.Length-10);

আপনার প্রথম শুধুমাত্র যদি আপনি জানেন যে গত অক্ষর কাজ করে ঠিক \bin\Debug কোন চিহ্ন সঙ্গে, ` and no other path, so it's extraordinarily fragile. Your second doesn't work because Environment.CurrentDirectory` একটি স্ট্রিং, এবং স্ট্রিং একটি না থাকে Parentসম্পত্তি।
জো হোয়াইট

জো, আমি ২ য় স্থান সরিয়েছি তবে আমি মনে করি এটি একটি বৈধ উত্তর, যদি পথটি সর্বদা \ বিন \ ডিবাগ হয় তবে এটি কার্যকর হবে। এবং যেমনটি আমি বলেছিলাম যে ওপিতে সত্যিকার অর্থে বিআরটি কী তা ডিরেক্টরিটির প্রয়োজনীয়তা চালায় এবং অন্যরকম পদ্ধতির ব্যবহার করা উচিত (আমি সম্ভবত একটি কনফিগারেশন এন্ট্রি ব্যবহার করব, তবে আমি বিআর এবং প্রোগ্রাম কাঠামোটি অনুমান করছি।)
হোগান

নিখুঁত এবং ভঙ্গুর না হলেও এটির একমাত্র সমাধান যা আমার পক্ষে কাজ করে। প্রস্তাবিত সম্পাদনা: "str_directory.length" "str_directory.Length" হওয়া উচিত, লোয়ার কেস এল গ্রহণযোগ্য নয়।
ওভারমার্স

2

ক্রস-ফর্ম কাজ করবে এমন কোনও সমাধান কেউ সরবরাহ করেনি। আমি জানি এটি বিশেষভাবে জিজ্ঞাসা করা হয়নি তবে আমি একটি লিনাক্স পরিবেশে কাজ করছি যেখানে বেশিরভাগ সমাধান (যেমন আমি এটি পোস্ট করার সময়) একটি ত্রুটি সরবরাহ করে।

হার্ডকোডিং পাথ বিভাজক (পাশাপাশি অন্যান্য জিনিসগুলি) উইন্ডোজ সিস্টেম ব্যতীত অন্য কোনও ক্ষেত্রে ত্রুটি দেয়।

আমার মূল সমাধানটিতে আমি ব্যবহার করেছি:

char filesep = Path.DirectorySeparatorChar;
string datapath = $"..{filesep}..{filesep}";

তবে এখানে কিছু উত্তর দেখার পরে আমি এটিকে সামঞ্জস্য করেছি:

string datapath = Directory.GetParent(Directory.GetParent(Directory.GetCurrentDirectory()).FullName).FullName; 

2

যেহেতু আমার কাছে অন্য কিছু খুঁজে পাওয়া যায় নি তা সত্যিই স্বাভাবিক উপায়ে সমাধান করতে সহায়তা করে, তাই এখানে আরও একটি উত্তর।

মনে রাখবেন যে অনুরূপ প্রশ্নের কয়েকটি উত্তর Uriপ্রকারটি ব্যবহার করার চেষ্টা করে তবে এটি পিছনে স্ল্যাশের সাথে লড়াই করে tra

এই পৃষ্ঠায় আমার অন্য উত্তরটি অপারেশনগুলির জন্য কাজ করে যা ফাইল সিস্টেমকে কাজ করতে দেয়, তবে আমরা যদি এখনই সমাধানের পথটি দেখতে চাই (যেমন তুলনার কারণে), ফাইল সিস্টেমের মধ্য দিয়ে না গিয়ে, C:/Temp/..এবং C:/অন্যরকম বিবেচিত হবে। ফাইল সিস্টেমে না গিয়ে, সেভাবে নেভিগেট করা আমাদের একটি সাধারণীকরণ, সঠিকভাবে তুলনীয় পথ সরবরাহ করে না।

আমরা কি করতে পারি?

আমরা নিম্নলিখিত আবিষ্কারের উপর ভিত্তি করে তৈরি করব:

Path.GetDirectoryName(path + "/") ?? ""হবে নির্ভরযোগ্যভাবে আমাদের ডিরেক্টরির পাথ দিতে একটি trailing স্ল্যাশ ছাড়া

  • স্ল্যাশ যোগ করার পদ্ধতি (যেমন string, না যেমন char) একটি বিবেচনা করবে nullপাথ একই যেমন একইরূপে ""
  • GetDirectoryName সংযুক্ত স্ল্যাশকে ধন্যবাদ সর্বশেষ পথের উপাদানটি অস্বীকার করা থেকে বিরত থাকবে।
  • GetDirectoryName স্ল্যাশ এবং নেভিগেশনাল ডটগুলি স্বাভাবিক করবে।
  • এর মধ্যে যেকোন পিছনের স্ল্যাশ অপসারণ অন্তর্ভুক্ত রয়েছে।
  • এর মধ্যে ..নেভিগেট করে ভেঙে পড়া অন্তর্ভুক্ত ।
  • GetDirectoryNamenullখালি পথে ফিরে আসবে , যা আমরা একত্রিত করেছি ""

আমরা এটি কীভাবে ব্যবহার করব?

প্রথমে ইনপুট পাথটি স্বাভাবিক করুন :

dirPath = Path.GetDirectoryName(dirPath + "/") ?? "";

তারপরে, আমরা প্যারেন্ট ডিরেক্টরিটি পেতে পারি এবং আরও নেভিগেট করতে আমরা এই অপারেশনটিকে যেকোন বার পুনরাবৃত্তি করতে পারি:

// This is reliable if path results from this or the previous operation
path = Path.GetDirectoryName(path);

মনে রাখবেন যে আমরা কখনও ফাইল সিস্টেমটি স্পর্শ করি নি। পথটির কোনও অংশের অস্তিত্বের প্রয়োজন নেই, যেমনটি যদি আমরা ব্যবহার করতাম DirectoryInfo


1

আপনার এটি করার চেষ্টা করা উচিত নয়। এনভায়রনমেন্ট.কর্ন্টডাইরেক্টরি আপনাকে এক্সিকিউটেবল ডিরেক্টরিের পথ দেয়। .Exe ফাইল যেখানেই থাকুক না কেন এটি সামঞ্জস্যপূর্ণ। পিছনের আপেক্ষিক অবস্থান হিসাবে ধরে নেওয়া হয় এমন কোনও ফাইল আপনার অ্যাক্সেস করার চেষ্টা করা উচিত নয়

আমি আপনাকে স্থানীয় কোনও জায়গায় যে কোনও সংস্থান অ্যাক্সেস করতে চান তা সরিয়ে নেওয়ার পরামর্শ দেব। একটি সিস্টেম ডিরেক্টরি (যেমন অ্যাপডেটা) এর


1
IO.Path.GetFullPath(@"..\..")

আপনি যদি bin\Debug\প্রকল্পের বৈশিষ্ট্যগুলিতে "> বিল্ড -> আউটপুট পাথ " " পরিষ্কার করেন তবে আপনি কেবল ব্যবহার করতে পারেনAppDomain.CurrentDomain.BaseDirectory

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