एप्लिकेशन फ़ोल्डर पथ प्राप्त करने का सबसे अच्छा तरीका है


514

मैं देखता हूं कि एप्लिकेशन फ़ोल्डर पथ प्राप्त करने के कुछ तरीके हैं:

  1. Application.StartupPath
  2. System.IO.Path.GetDirectoryName( System.Reflection.Assembly.GetExecutingAssembly().Location)
  3. AppDomain.CurrentDomain.BaseDirectory
  4. System.IO.Directory.GetCurrentDirectory()
  5. Environment.CurrentDirectory
  6. System.IO.Path.GetDirectoryName( System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase)
  7. System.IO.Path.GetDirectory(Application.ExecutablePath)

स्थिति के आधार पर सबसे अच्छा तरीका क्या है?


9
हमारे पास एप्लिकेशन पाने के लिए बहुत सारे रास्ते क्यों हैं। मुझे लगता है कि प्रत्येक तरीके का एक कारण है।
लियो वो

1
# 6 में एक त्रुटि है: पढ़ना चाहिए: System.Reflection.Assembly.GetExecutingAssembly ()। GetName ()। CodeBase), System.IO.Path.GetDirectoryName (Application
.ExecutablePath

2
# 6 के लिए हुर्रे, जबकि मैं एक वेब परियोजना में हूं, मैं नहीं चाहता था कि मेरे IoC भरी हुई लाइब्रेरी में
Server.apPath

अब हमारे पास एक विश्वसनीय IHostEnvironment.ContentRootPath, इंजेक्शन की IHostEnvironmentनिर्भरता (जिसमें अन्य उपयोगी चीजें हैं) के माध्यम से पहुँचा जा सकता है ।
टिमो

जवाबों:


518

AppDomain.CurrentDomain.BaseDirectory संभवत: उन फ़ाइलों तक पहुँचने के लिए सबसे उपयोगी है, जिनका स्थान एप्लिकेशन इंस्टॉल निर्देशिका के सापेक्ष है।

ASP.NET अनुप्रयोग में, यह एप्लिकेशन रूट डायरेक्टरी होगी, न कि बिन सबफ़ोल्डर - जो कि आमतौर पर आप चाहते हैं। क्लाइंट एप्लिकेशन में, यह मुख्य निष्पादन योग्य निर्देशिका होगी।

VSTO 2005 के आवेदन में, यह वो निर्देशिका होगी जिसमें आपके आवेदन के लिए VSTO प्रबंधित असेंबली होती है, न कि, एक्सेल निष्पादन योग्य मार्ग।

अन्य लोग आपके वातावरण के आधार पर अलग-अलग निर्देशिकाएं लौटा सकते हैं - उदाहरण के लिए @ Vimvq1987 का उत्तर देखें।

CodeBaseवह स्थान है जहाँ एक फ़ाइल मिली थी और http: // के साथ एक URL की शुरुआत हो सकती है। जिस स्थिति Locationमें संभवत: असेंबली डाउनलोड कैश होगा। कोडबेस को GAC में असेंबली के लिए सेट करने की गारंटी नहीं है ।


2
विंडोज एक्सपी 32 बिट में परीक्षण करते समय, यह वहीं लौटता है जहां शॉर्टकट शुरू हुआ था।
यहोशू पुत्र

1
+1 @Joe और VSTO दस्तावेज़-स्तरीय ऐड-इन के लिए यह

3
विदित हो कि यह एक बैकस्लैश के साथ एक रास्ता देता है। प्रक्रिया तर्क के रूप में पारित करने के लिए परिणाम के साथ एक स्ट्रिंग को स्वरूपित करते समय इससे मुझे समस्याएँ हुईं।
एवेंमोर

19
@avenmore - यदि आप एक पथ बनाने के लिए एक स्ट्रिंग को स्वरूपित कर रहे हैं, तो Path.Combineइसके बजाय का उपयोग करने पर विचार करें । यह आपके लिए पीछे आने वाले बैकस्लैश का ध्यान रखेगा।
जो

1
यह मेरे लिए VS 2017 में बिन / डिबग फोल्डर लौटा रहा है, रूट डायरेक्टरी नहीं।
स्मूचबीबी

86
  1. Application.StartupPathऔर 7. System.IO.Path.GetDirectoryName(Application.ExecutablePath)- केवल विंडोज फॉर्म एप्लीकेशन के लिए काम करने वाला है

  2. System.IO.Path.GetDirectoryName( System.Reflection.Assembly.GetExecutingAssembly().Location)

    आपको कुछ ऐसा देने जा रहा है: "C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319\\Temporary ASP.NET Files\\legal-services\\e84f415e\\96c98009\\assembly\\dl3\\42aaba80\\bcf9fd83_4b63d101"जो कि आपके द्वारा चलाए जा रहे पृष्ठ का है।

  3. AppDomain.CurrentDomain.BaseDirectoryवेब अनुप्रयोग के लिए उपयोगी हो सकता है और कुछ ऐसा लौटाएगा "C:\\hg\\Services\\Services\\Services.Website\\"जो आधार निर्देशिका है और काफी उपयोगी है।

  4. System.IO.Directory.GetCurrentDirectory() और 5। Environment.CurrentDirectory

आपको वह स्थान मिलेगा जहां प्रक्रिया से निकाल दिया गया था - इसलिए विज़ुअल स्टूडियो से डिबग मोड में चल रहे वेब ऐप के लिए कुछ इस तरह "C:\\Program Files (x86)\\IIS Express"

  1. System.IO.Path.GetDirectoryName( System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase)

आपको वह स्थान मिलेगा जहाँ .dllवह कोड चल रहा है, वेब ऐप के लिए जो हो सकता है"file:\\C:\\hg\\Services\\Services\\Services.Website\\bin"

अब उदाहरण के लिए कंसोल ऐप पॉइंट 2-6 डायरेक्टरी में होगा जहां .exe फ़ाइल है।

आशा है कि यह आपको कुछ समय बचाता है।


2
बहुत यकीन है कि "वर्तमान फ़ोल्डर" केवल गैर-वेब ऐप्स के लिए वैसे भी प्रासंगिक है ...
Nyerguds

2
यह उत्तर है।
पी। ब्रायन। मैके

59

ध्यान दें कि ये सभी विधियाँ समान मान नहीं लौटाएंगी। कुछ मामलों में, वे समान मूल्य वापस कर सकते हैं, लेकिन सावधान रहें, उनके उद्देश्य अलग हैं:

Application.StartupPath

StartupPathपैरामीटर लौटाता है (अनुप्रयोग चलाने पर सेट किया जा सकता है)

System.IO.Directory.GetCurrentDirectory()

वर्तमान निर्देशिका को लौटाता है, जो उस फ़ोल्डर में नहीं हो सकता है जहां एप्लिकेशन स्थित है। उसी के लिए जाता है Environment.CurrentDirectory। यदि आप इसका उपयोग DLL फ़ाइल में कर रहे हैं, तो यह उस पथ को लौटा देगा जहाँ प्रक्रिया चल रही है (यह ASP.NET में विशेष रूप से सच है)।


7
कृपया GetCurrentDirectory()विभिन्न रास्तों से चीजों को चलाने के प्यार के लिए, कृपया उपयोग न करें ! :(
kayleeFrye_onDeck

@kayleeFrye_onDeck आपने पिछले प्रश्न के लिए अपने कारण नहीं रखे।
nless

10

एक वेब एप्लिकेशन के लिए, वर्तमान वेब एप्लिकेशन रूट निर्देशिका प्राप्त करने के लिए, आमतौर पर वर्तमान आने वाले अनुरोध के लिए वेब पेज से कॉल करें:

HttpContext.Current.Server.MapPath();

System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath;

कोड विवरण के ऊपर


6

मैंने उपयोगकर्ता से सत्र में Win32 एपीआई पर एक विंडोज सेवा से एक प्रक्रिया शुरू की जो वास्तव में लॉग इन है (टास्क मैनेजर सत्र 1 से 0 में)। इसमें हम जान सकते हैं, कि कौन सा चर सबसे अच्छा है।

उपरोक्त प्रश्न से सभी 7 मामलों के लिए, निम्नलिखित परिणाम हैं:

Path1: C:\Program Files (x86)\MyProgram
Path2: C:\Program Files (x86)\MyProgram
Path3: C:\Program Files (x86)\MyProgram\
Path4: C:\Windows\system32
Path5: C:\Windows\system32
Path6: file:\C:\Program Files (x86)\MyProgram
Path7: C:\Program Files (x86)\MyProgram

शायद यह आप में से कुछ के लिए उपयोगी है, एक ही सामान कर रहा है, जब आप अपने मामले के लिए सबसे अच्छा चर खोजते हैं।


4
बहुत ही प्रासंगिक जवाब। इतने सारे लोग यह भूल जाते हैं कि "कार्यशील निर्देशिका"! = "कार्यक्रम निर्देशिका"।
Nyerguds

3

मेरे अनुभव में, सबसे अच्छा तरीका इनमें से एक संयोजन है।

  1. System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase आपको बिन फ़ोल्डर देगा
  2. Directory.GetCurrentDirectory() .Net Core पर ठीक काम करता है लेकिन .Net नहीं और आपको प्रोजेक्ट की रूट डायरेक्टरी देगा
  3. System.AppContext.BaseDirectoryऔर AppDomain.CurrentDomain.BaseDirectory .Net में ठीक काम करता है लेकिन .Net कोर नहीं है और आपको परियोजना की मूल निर्देशिका देगा

एक क्लास लाइब्रेरी में जिसे टारगेट किया जाना चाहिए। नेट और .नेट कोर I चेक करते हैं कि कौन सा फ्रेमवर्क होस्ट कर रहा है और एक या दूसरे को चुनें।


2

मैंने इसका सफलतापूर्वक उपयोग किया है

System.IO.Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName)

यह linqpad के अंदर भी काम करता है


1
यह GetCurrentProcess के उद्घाटन को याद कर रहा है। btw यह दृश्य स्टूडियो में डिबगिंग करते समय मेरे .net कोर प्रोजेक्ट में C: \ Program Files \ dotnet का मूल्यांकन करता है क्योंकि thats जहां dotnet.exe स्थित है
t0b4cc0

1

मूल निर्देश संहिता:

DriveInfo cDrive = new DriveInfo(System.Environment.CurrentDirectory);
var driverPath = cDrive.RootDirectory;

1
यह वर्तमान कार्यशील निर्देशिका को प्राप्त करता प्रतीत होता है, जबकि यह कभी-कभी उपयोगी हो सकता है, यह निश्चित रूप से EXE पथ होने की गारंटी नहीं है।
क्रोव 2


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