मैं C # में मूल निर्देशिका कैसे ढूँढ सकता हूँ?


85

मैं डिबग निर्देशिका खोजने के लिए इस कोड का उपयोग करता हूं

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"


15
लोग हमेशा स्ट्रिंग्स पर ToString () का उपयोग क्यों करते हैं?
होगन

1
@ हॉगन, संपत्ति में बदलाव के मामले में? : डी
म्यूज़फ़न

जवाबों:


126

आप System.IO.Directory.GetParent()किसी दिए गए निर्देशिका के मूल निर्देशिका को पुनः प्राप्त करने के लिए उपयोग कर सकते हैं ।


21
यदि डायरेक्टरी में स्लैशिंग में कमी है, तो आपको गेटपरेंट को दो बार कॉल करना होगा
उत्तरबेन

2
यह सापेक्ष रास्तों (खुश आश्चर्य) पर काम करने के लिए प्रकट होता है, लेकिन फिर आपके पास परिणाम वापस पाने के लिए कोई रास्ता नहीं है (दुखी आश्चर्य)।
एडम

14
आप का उपयोग करने के बजाय अनुगामी स्लैश समस्या से बच सकते हैं DirectoryInfo.Parent। उदा new System.IO.DirectoryInfo("c:/path/to/somewhere//").Parent। @ नॉर्थबेन
mcNux


35

यदि आप ..\..अपने मौजूदा पथ के लिए आगे बढ़ते हैं , तो ऑपरेटिंग सिस्टम भव्य-माता-पिता फ़ोल्डर को सही ढंग से ब्राउज़ करेगा।

यह काम करना चाहिए:

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

यदि आप उस पथ को ब्राउज़ करते हैं, तो आप भव्य-मूल निर्देशिका को ब्राउज़ करेंगे।


1
यह अच्छा लग रहा था, लेकिन दुर्भाग्य से C: \ Users \ Masoud \ Documents \ Visual Studio 2008 \ Projects \ MyProj \ MyProj \ bin \ Debug \ .. को देता है ..
StuartQ

हां और यदि आप उस रास्ते को ब्राउज़ करते हैं, तो आप माता-पिता-मूल निर्देशिका को ब्राउज़ करेंगे।
पियरे-एलेन विगेंट 13

फेयर पॉइंट, मैं डाउनवोट को हटा दूंगा, हालांकि पॉइंट को वापस देने के लिए मुझे आपकी टिप्पणी को संपादित करना होगा।
स्टुअर्टक्यू

3
"Path.Combine" के परिणाम को "Path.GetFullPath" के माध्यम से साफ किया जा सकता है। यह "C: \ Users \ Masoud \ Documents \ Visual Studio 2008 \ Projects \ MyProj \ MyProj" को प्राप्त करना है
Konstantin

1
यह निर्देशिका ट्री
ट्रुंग ले

18

मुझे System.IO.Path.Combine(myPath, "..")सबसे आसान और सबसे विश्वसनीय वेरिएंट मिला है । इससे भी अधिक अगर उत्तरबेन कहती है तो यह सच है, कि गेटपैरेंट को एक अतिरिक्त कॉल की आवश्यकता होती है यदि कोई अनुगामी स्लैश है। वह, मेरे लिए, अविश्वसनीय है।

Path.Combine यह सुनिश्चित करता है कि आप स्लैश के साथ कभी गलत न हों।

..बिल्कुल वैसा ही व्यवहार करता है जैसा कि विंडोज में हर जगह होता है। आप किसी भी संख्या को जोड़ सकते हैं\.. cmd या एक्सप्लोरर में पथ को और यह बिल्कुल वैसा ही व्यवहार करेगा जैसा मैं नीचे बता रहा हूं।

कुछ बुनियादी ..व्यवहार:

  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:\


1
मैं इस बात से सहमत हूं कि इस पद्धति में काम करने का लाभ है कि क्या पथ में पीछे की ओर पीछे है या नहीं। और ऐसी स्थितियों में जहाँ आप डॉट्स के बिना एक सरल मार्ग चाहते हैं, आप Path.GetFullPath () परिणाम पर लागू कर सकते हैं।
RenniePet

1
दो साल बाद और मैं खुद को यहां फिर से पाता हूं। विदित हो कि Path.GetFullPath () आम तौर पर बिना किसी ट्रेलिंग बैकस्लैश के एक पथ देता है, लेकिन जब आप रूट डायरेक्टरी के लिए
उठते हैं

यह काम नहीं करता है, न तो .NET 4.7 और न ही .NET Core 2.1: Path.Combine(@"D:\Grandparent\Parent\Child.txt", @"..")=D:\Grandparent\Parent\Child.txt\..
Métoule

यह मेरे लिए फ़ाइलनाम को कम नहीं करता है, कम से कम एकता के माध्यम से MacOS पर।
२२:०४

@ Métoule @supergra मैं भ्रम देखता हूं। Path.Combineस्ट्रिंग को ही नहीं काटता है। पथ , जो एक बार फ़ाइल सिस्टम तक पहुंचने के लिए उपयोग किया जाता है, का इच्छित प्रभाव होता है। हालाँकि, मैं सहमत हूँ कि यह उप-विषयी है। पथ को हल करने के लिए फ़ाइल सिस्टम की आवश्यकता के बजाय स्ट्रिंग को संशोधित करने वाले दृष्टिकोण के लिए इस पृष्ठ पर मेरा और हालिया उत्तर देखें ।
तिमो


8

Directory.GetParentशायद एक बेहतर जवाब है, लेकिन पूर्णता के लिए एक अलग विधि है जो स्ट्रिंग और रिटर्न स्ट्रिंग लेती है Path.GetDirectoryName:।

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

1
माइंड यू पाथ.गेटडायरेक्टरीनाम नहीं है, जो सापेक्ष रास्तों के साथ अच्छी तरह से काम करता है .. Directory.GetParent करता है।
नवाफल

6

इस कदर:

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

सौभाग्य!


1
myDirectory.Parent.ToString () सबफ़ोल्डर का नाम लौटाता है, पूर्ण पथ नहीं, बिल्कुल वही जो मैं ढूंढ रहा था। इसके अलावा, Directory.GetParent (Directory.GetParent (str_directory) .ToString ()) करने के बजाय; जैसा कि ऊपर दिखाया जा रहा है, बस myDirectory.parent.parent.ToString () का उपयोग करके 'दादा-दादी' हो जाता है।
वीहुई गुओ

1
मुझे यह तरीका सबसे अच्छा लगता है क्योंकि यह उस केस को हैंडल करता है जहाँ आपकी डाइरेक्टरी पथ में स्लैशिंग स्लैश है। जबकि यदि आप Directory.GetParent () का उपयोग करते हैं, तो आपको स्लैश को हटाने के लिए दो बार कॉल करना होगा और फिर वास्तविक माता-पिता को प्राप्त करना होगा।
मैग्नस


3

ट्रेलिंग \ के साथ समस्याओं से बचने के लिए, इसे इस तरह से कॉल करें:

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

1
आप उपयोग कर सकते हैं TrimEndयदि आप केवल ट्रेलिंग को हटाना चाहते हैं `'s . I'm not sure if a leading `अन्य OSes में महत्वपूर्ण है।
वाल्टर स्टबोस

2

अपना समाधान पाने के लिए यह प्रयास करें

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

2

यह सबसे आम तरीका है - यह वास्तव में इस बात पर निर्भर करता है कि आप वास्तव में क्या कर रहे हैं: (समझाने के लिए, नीचे दिया गया उदाहरण पिछले 10 वर्णों को हटा देगा, जो आपने पूछा था, हालांकि अगर कुछ व्यावसायिक नियम हैं जो आपकी आवश्यकता को पूरा कर रहे हैं किसी विशिष्ट स्थान को खोजने के लिए आपको निर्देशिका स्थान को पुनः प्राप्त करने के लिए उपयोग करना चाहिए, किसी अन्य स्थान का पता नहीं लगाना चाहिए और इसे संशोधित करना चाहिए।)

// 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 परिवेश नहीं है। CurrentDirectory` एक स्ट्रिंग है, और स्ट्रिंग्स में कोई Parentगुण नहीं है ।
जो व्हाइट

@ जो, मैंने 2 को हटा दिया। लेकिन मुझे लगता है कि यह एक वैध जवाब है, अगर रास्ता हमेशा \ बिन \ डिबग होता है तो यह काम करेगा। और जैसा कि मैंने कहा कि ओपी को वास्तव में यह देखना चाहिए कि बीआर क्या है जो निर्देशिका की आवश्यकता को बढ़ाता है और एक अलग दृष्टिकोण का उपयोग करता है (मैं शायद एक कॉन्फ़िगरेशन प्रविष्टि का उपयोग करूंगा, लेकिन मैं बीआर और प्रोग्राम संरचना पर अनुमान लगा रहा हूं।)
होगन

जबकि सही और नाजुक नहीं, इसका एकमात्र समाधान जो मेरे लिए काम करता है। सुझाए गए संपादन: "str_directory.length" "str_directory.Length" होना चाहिए, निचला मामला L स्वीकार्य नहीं है।
ओवरमर

2

किसी ने ऐसा समाधान नहीं दिया है जो क्रॉस-फॉर्म का काम करे। मुझे पता है कि यह विशेष रूप से नहीं पूछा गया था, लेकिन मैं एक लिनक्स वातावरण में काम कर रहा हूं जहां अधिकांश समाधान (जब मैं यह पोस्ट करता हूं) एक त्रुटि प्रदान करेगा।

हार्डकोडिंग पथ विभाजक (साथ ही अन्य चीजें) कुछ भी लेकिन विंडोज सिस्टम में त्रुटि देगा।

मेरे मूल समाधान में मैंने इस्तेमाल किया:

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

हालाँकि यहाँ कुछ उत्तरों को देखने के बाद मैंने इसे समायोजित किया:

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

2

चूंकि मुझे और कुछ नहीं मिला है, इसलिए इसे वास्तव में सामान्यीकृत तरीके से हल करने में मदद करता है, यहां एक और जवाब है।

ध्यान दें कि इसी तरह के प्रश्नों के कुछ उत्तर Uriप्रकार का उपयोग करने की कोशिश करते हैं , लेकिन यह पीछे चल रहे स्लैश बनाम नो ट्रेलिंग स्लैश के साथ भी संघर्ष करता है।

इस पृष्ठ पर मेरा अन्य उत्तर उन ऑपरेशनों के लिए काम करता है जो फ़ाइल सिस्टम को काम करने के लिए काम करते हैं, लेकिन अगर हम चाहते हैं कि अभी हल किया हुआ रास्ता (जैसे कि तुलनात्मक कारणों से), फ़ाइल सिस्टम के माध्यम से जाने के बिना, C:/Temp/..औरC:/ अलग माना जाएगा। फ़ाइल सिस्टम के माध्यम से जाने के बिना, उस तरीके से नेविगेट करना हमें एक सामान्यीकृत, ठीक से तुलनीय पथ प्रदान नहीं करता है।

हम क्या कर सकते है?

हम निम्नलिखित खोज पर निर्माण करेंगे:

Path.GetDirectoryName(path + "/") ?? ""होगा मज़बूती से हमें एक निर्देशिका पथ देना स्लैश के बिना

  • एक स्लैश (के रूप में जोड़ा जा रहा है 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

आपको ऐसा करने की कोशिश नहीं करनी चाहिए। Environment.CurrentDirectory आपको निष्पादन योग्य निर्देशिका का पथ देता है। यह जहाँ .exe फ़ाइल है, के अनुरूप है। आपको किसी ऐसी फ़ाइल तक पहुँचने की कोशिश नहीं करनी चाहिए, जिसे एक पिछड़े सापेक्ष स्थान में माना जाता है

मैं आपको सुझाव दूंगा कि आप किसी स्थानीय स्थान पर जो भी संसाधन पहुंचाना चाहते हैं, उसे स्थानांतरित करें। एक प्रणाली निर्देशिका (जैसे AppData)


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

यदि आप bin\Debug\प्रोजेक्ट गुणों में " " को स्पष्ट करते हैं -> बिल्ड -> आउटपुट पथ, तो आप बस उपयोग कर सकते हैंAppDomain.CurrentDomain.BaseDirectory

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