एक WPF आवेदन से आवेदन की निर्देशिका हो रही है


170

मुझे AppDomain के साथ विंडोज फॉर्म के लिए समाधान मिला, लेकिन WPF Applicationऑब्जेक्ट के लिए क्या समान होगा ?

जवाबों:


329

एक विधि:

System.AppDomain.CurrentDomain.BaseDirectory

इसे करने का एक और तरीका होगा:

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

आह, धन्यवाद। किसी तरह से AppDomain को नजरअंदाज कर दिया जाना चाहिए। मैं इसे ढूंढ रहा था, वास्तव में ...
जॉय

3
@ हेलन: अपवोट्स को देखते हुए, यह स्पष्ट रूप से एक उत्कृष्ट जवाब है। हालाँकि, उत्तर में ऐप को प्राप्त करने के दो तरीके हैं। क्या वे दोनों समान रूप से अच्छी तरह से काम करेंगे?
क्रिस्टोफर लेटेस्ट

21
मैं पहले विकल्प का उपयोग करूंगा। यह सरल दिखता है, एक विधि कॉल नहीं है और यह पढ़ने पर लाइन वास्तव में क्या करती है, इस पर कम संदेह पैदा करती है।
फिलिप

3
मैंने डब्ल्यूसीएफ सेवा में, डब्ल्यूपीएफ एप्लीकेशन में और क्लास लाइब्रेरी प्रोजेक्ट में पहली विधि का उपयोग किया है और सभी में ठीक काम किया है।
एपोस्ट्रोफिक्स

1
NetCore और NetStandard के लिए, मैं दूसरे की सिफारिश करूंगा, क्योंकि AppDomain 2.0 में जोड़ा गया था और हमेशा अपेक्षित के रूप में सेट नहीं किया जा सकता
cdie

28

यहाँ एक और है:

System.Reflection.Assembly.GetExecutingAssembly().Location

2
डॉक्स में बताई गई छाया-प्रति के बाद इसे स्थान मिल जाता है । मुझे वास्तव में यकीन नहीं है कि अगर स्वीकृत उत्तर में सुझाव छाया-प्रतिलिपि से प्रभावित होते हैं।
क्रिस्टोफर लेफ्टे सेप

2
इससे मुझे DLL I की उप-निर्देशिका मिली, जो मुख्य कार्यक्रम निर्देशिका नहीं थी।
स्ट्रैटन

7

आप कमांड लाइन तर्कों के पहले तर्क का भी उपयोग कर सकते हैं:

String exePath = System.Environment.GetCommandLineArgs()[0]


1
हालाँकि, ध्यान दें कि एक "बुराई" एप्लिकेशन अपने कमांड लाइन तर्कों को संशोधित कर सकता है।
डैनियल रोज

@ डैनियल: यह खुद ही क्यों करेगा? या आप एक अलग आवेदन का मतलब है?
मर्लिन मॉर्गन-ग्राहम

1
@Merlyn: ब्लॉगसेम्सडेनबी / बी / बोल्डनव्यू / ऑर्काइव / 11/3728372.aspx देखें मैं बोली हूँ: यह "प्रक्रिया के स्टार्टअप कोड के लिए सुविधाजनक रूप से आरंभिक पैरामीटर है।" तो आप जानबूझकर या अनजाने में उस मेमोरी लोकेशन को संशोधित कर सकते हैं।
डैनियल रोज

1
@ डैनियल: कौन कर सकता है? एक और प्रक्रिया, या एक ही प्रक्रिया? यदि आप अपने आप को पैर में गोली मारते हैं, तो नीचे ट्रैक करना आसान होना चाहिए। मुझे लगता है कि कम बुराई, और अधिक मूर्खतापूर्ण :) अगर कोई अन्य प्रक्रिया इसे कर सकती है, तो वह अधिक दिलचस्प है। संपादित करें: मैं एक रनिंग प्रोग्राम की कमांड लाइन को संशोधित करने के बारे में उस लेख में कुछ भी नहीं देख रहा हूं - केवल यह कि लॉन्चिंग प्रक्रिया इसे पास करती है (यह निश्चित नहीं है कि कमांड लाइन को बदलने के लिए लॉन्चिंग प्रक्रिया के लिए यह अवांछनीय है), और आप इसे क्वेरी कर सकते हैं WMI के माध्यम से।
मेरलिन मॉर्गन-ग्राहम

@ MerlynMorgan-ग्राहम एक दुर्भावनापूर्ण एप्लिकेशन मेमोरी एड्रेस को संशोधित कर सकता है, और आपके एप्लिकेशन को इसके बजाय किसी अन्य दुर्भावनापूर्ण एप्लिकेशन को चलाने के लिए मजबूर कर सकता है। यह गलत है, क्योंकि मान लें कि उनका आवेदन एक keylogger है और वे चाहते हैं कि जैसे ही आप एक sepcific एप्लिकेशन खोलें, इसे सक्रिय करें। इसलिए उनके कोड में वे आपके एप्लिकेशन नाम को कैप्चर करेंगे, पृष्ठभूमि में उनके keylogger को चलाएंगे, और फिर अपना एप्लिकेशन चलाएंगे। यूजर क्लूलेस होगा। लेख यह समझाता है, लेकिन यह आपको नहीं बताता कि यह कैसे करना है। शायद यह है कि आप क्या देख रहे थे?
pqsk 14

6

मैंने बस string baseDir = Environment.CurrentDirectory;और इसका काम मेरे लिए किया।

शुभ लाभ

संपादित करें:

मैं इस प्रकार की गलती को हटाता था, लेकिन मैं इसे संपादित करना पसंद करता हूं क्योंकि मुझे लगता है कि इस उत्तर पर ऋण बिंदु लोगों को गलत तरीके से जानने में मदद करता है। :) मैं समझता था कि उपरोक्त समाधान उपयोगी नहीं है और मैंने इसे प्राप्त करने के string appBaseDir = System.AppDomain.CurrentDomain.BaseDirectory; अन्य तरीकों में बदल दिया है :

1. string baseDir =   
    System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
 2. String exePath = System.Environment.GetCommandLineArgs()[0];
 3. string appBaseDir =    System.IO.Path.GetDirectoryName
    (System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName);

शुभ लाभ


3
यह वर्तमान कार्यशील निर्देशिका है। यह एप्लिकेशन डायरेक्टरी के साथ विचार कर सकता है, लेकिन वे अलग-अलग अवधारणाएं हैं (और सबसे महत्वपूर्ण बात यह है कि वर्किंग डायरेक्टरी बदल सकती है, उदाहरण के लिए यदि आपके पास एक आम फ़ाइल डायलॉग खुला है)।
जॉय

1
@ आप सही हैं। मैंने इसे इसे बदल दिया: स्ट्रिंग appBaseDir = System.AppDomain.CurrentDomain.BaseDirectory; धन्यवाद।
QMaster


3

इसे इस्तेमाल करे। मत भूलना using System.Reflection

string baseDir = System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);

1

मैंने यह कोशिश की:

    label1.Content = Directory.GetCurrentDirectory();

और निर्देशिका भी प्राप्त करें।


इसे वर्तमान कार्यशील निर्देशिका मिलती है, जो प्रक्रिया निर्देशिका से भिन्न हो सकती है।
थ्रक

मुझे लगता है कि मुझे Directory.GetCurrentDirectory () का मूल्यांकन करना है; अधिक। धन्यवाद @ सुधार के लिए धन्यवाद।
पौल

0

आप System.Windows.Forms से भी स्वतंत्र रूप से Application.StartupPath का उपयोग कर सकते हैं, लेकिन आपको System.Windows.Forms विधानसभा के लिए संदर्भ जोड़ना होगा!

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