वर्तमान फ़ोल्डर पथ प्राप्त करें


222

मैं एक प्रोग्राम बनाना चाहता हूं जो फ़ाइलों को परिवर्तित करता है। मैं चाहूंगा कि उपयोगकर्ता किसी भी निर्देशिका में निष्पादन योग्य फ़ाइल को रखने में सक्षम हो, और उस कार्यक्रम को निष्पादित करते समय (.exe पर डबल-क्लिक करें) मैं चाहता हूं कि कार्यक्रम वर्तमान फ़ोल्डर के भीतर सभी फ़ाइलों को संसाधित करें जहां एक्स फ़ाइल मौजूद है । कार्यक्रम उस पथ को कैसे निर्धारित कर सकता है जिसमें वह वर्तमान में निष्पादित हो रहा है?

मैंने कोशिश की System.Windows.Forms.Application.StartupPathलेकिन यह गलत तरीका लगता है।

कोई विचार?

जवाबों:


334

आपको अपने मामले में उपयोग नहीं करना चाहिए Directory.GetCurrentDirectory(), क्योंकि वर्तमान निर्देशिका निष्पादन फ़ोल्डर से भिन्न हो सकती है, खासकर जब आप शॉर्टकट के माध्यम से प्रोग्राम निष्पादित करते हैं।

Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);अपने उद्देश्य के लिए उपयोग करना बेहतर है । यह पथनाम वापस कर देता है जहां वर्तमान में असेंबली का निष्पादन होता है।

जबकि मेरे सुझाए गए दृष्टिकोण से आपको निष्पादित विधानसभा, प्रविष्टि विधानसभा या किसी अन्य भरी हुई विधानसभा के बीच अंतर करने की अनुमति मिलती है, जैसा कि सोनर ग्नूएल ने अपने जवाब में कहा,

System.IO.Path.GetDirectoryName(Application.ExecutablePath);

पर्याप्त भी हो सकता है। यह बराबर होगा

System.IO.Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);

10
GetEntryAssembly () और GetExecutingAssembly () में एक दिलचस्प अंतर है। जानकारी के लिए देखें stackoverflow.com/a/18562036/30289
bhadra

3
जैसा कि मैंने कहा: यह पथनाम वापस कर देता है जहां वर्तमान में निष्पादित विधानसभा रहती है। के बीच अंतर GetEntryAssemblyऔर GetExecutingAssemblyआश्चर्य के रूप में ज्यादा नहीं आता है, फ़ंक्शन नाम से भी स्पष्ट है। यदि उन्होंने ऐसा ही किया, तो दो कार्य क्यों होने चाहिए? :-)
थोर्स्टन डिटमार

2
+1 असेम्बली.गेटइंट्रीआसपास () ने क्लिकऑन के माध्यम से चल रहे आवेदन के मामले में मेरी मदद की
Artiom

9
यह System.Reflection में है, इसलिए System.Reflection.Assembly.GetExecutingAssembly().Locationपूर्ण है - यदि आप तत्काल विंडो से परीक्षण कर रहे हैं
लाल मटर

147
System.AppDomain.CurrentDomain.BaseDirectory

यह आपको आपके एप्लिकेशन की रनिंग डायरेक्टरी देगा। यह वेब अनुप्रयोगों के लिए भी काम करता है। बाद में आप अपनी फ़ाइल तक पहुँच सकते हैं।


9
इस उद्देश्य के लिए उपयोग करने के लिए यह सबसे सटीक संपत्ति है। CurrentDomain की BaseDirectory हमेशा सही स्थान को इंगित करेगी, भले ही AppDomain एक अलग स्थान से विधानसभाओं को देखने के लिए गतिशील रूप से बनाया गया हो।
druvin

उत्तम। यह किसी भी एप्लिकेशन के लिए स्वतंत्र रूप से काम करता है, खासकर जब स्ट्रीमरडर का उपयोग करते हैं, जो कि आवेदन के प्रकार के आधार पर विभिन्न निरपेक्ष पथ को पढ़ सकता है।
user3326078

40

मैंने निम्नलिखित कोड के साथ एक सरल कंसोल एप्लिकेशन बनाया:

Console.WriteLine(System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location));
Console.WriteLine(System.AppDomain.CurrentDomain.BaseDirectory);
Console.WriteLine(System.Environment.CurrentDirectory);
Console.WriteLine(System.IO.Directory.GetCurrentDirectory());
Console.WriteLine(Environment.CurrentDirectory);

मैंने परिणामी निष्पादन योग्य को कॉपी किया C:\temp2। मैंने तब उस निष्पादन योग्य के लिए एक शॉर्टकट रखा C:\temp3, और उसे चलाया (एक बार स्वयं से और एक बार शॉर्टकट से)। इसने दोनों बार निम्न आउटपुट दिए:

C:\temp2
C:\temp2\
C:\temp2
C:\temp2
C:\temp2

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

अद्यतन: मैंने "प्रारंभ में:" फ़ील्ड को बदलते हुए शॉर्टकट गुणों को संशोधित किया है C:\temp3। इसका परिणाम निम्न आउटपुट में हुआ:

C:\temp2
C:\temp2\
C:\temp3
C:\temp3
C:\temp3

... जो विभिन्न तरीकों के बीच कम से कम कुछ भेदों को प्रदर्शित करता है।


2
आपका बहुत बहुत धन्यवाद।
baj9032

एक महत्वपूर्ण नोट। कार्यशील निर्देशिका हमेशा स्थापित निर्देशिका के समान नहीं होने वाली है।
जॉर्डन


21
string appPath = System.IO.Path.GetDirectoryName(Application.ExecutablePath);

से Path.GetDirectoryName

निर्दिष्ट पथ स्ट्रिंग के लिए निर्देशिका जानकारी लौटाता है।

से Application.ExecutablePath

निष्पादन योग्य फ़ाइल के लिए पथ प्राप्त करता है, जिसने निष्पादन योग्य नाम सहित आवेदन शुरू किया था।


19

इसे इस्तेमाल करो,

var currentDirectory = System.IO.Directory.GetCurrentDirectory(); 

आप इसका भी उपयोग कर सकते हैं।

var currentDirectory = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);

9

के लिए नेट कोर उपयोगSystem.AppContext.BaseDirectory

(के लिए एक प्रतिस्थापन के रूप में AppDomain.CurrentDomain.BaseDirectory)


6

1।

Directory.GetCurrentDirectory();

2।

Thread.GetDomain().BaseDirectory

3।

Environment.CurrentDirectory

Environment.CurrentDirectoryतरीकों की एक संख्या में बदला जा सकता है ... (शॉटट्रैक सेटिंग्स, आदि)
Yousha Aleayoub



0

यह मेरे लिए सबसे अच्छा काम करता है, खासकर डॉटनेट कोर सिंगल फाइल पब्लिश का उपयोग करते समय। Path.GetDirectoryName(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName)

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