2008-10-31 12 views
16

निष्पादित कर रही है मेरे ऐप्स के लिए, मैं कुछ कॉन्फ़िगरेशन फ़ाइल को एक्सएमएल में असेंबली (एक्सई), और कुछ अन्य अस्थायी फ़ाइलों को उद्देश्य के लिए संग्रहीत करने के लिए संग्रहीत करता हूं।निर्देशिका प्राप्त करने का सबसे अच्छा तरीका क्या है जिसमें से एक असेंबली

मुझे ".\\" और Application.StartupPath के साथ कुछ quirk मिला।

मैं प्रयोग कर रहे

String configPath = ".\\config.xml"; 

जब तक मैं OpenFIleDialog बुलाया अन्य फ़ोल्डर में कुछ फ़ाइलों को खोलने के लिए यह ठीक काम करता है, में विफल रहा है ऊपर बयान। स्पष्ट रूप से "। \" "CurrentDirectory" का जिक्र कर रहा है, जो हर बार जब हम किसी अन्य फ़ोल्डर में ब्राउज़ करते हैं तो बदलता है।

कुछ बिंदु पर, मैं

String configPath = Path.Combine(Application.StartupPath + "config.xml"); 

उपयोग कर रहा था कुछ बिंदु पर, जब मैं Process.Start() का उपयोग करके किसी अन्य फ़ोल्डर से इस विधानसभा पर अमल करने की जरूरत है, चीजों को अलग गिर करने के लिए शुरू करते हैं। स्पष्ट रूप से कार्यशील निर्देशिका ठीक से सेट नहीं है, और Application.StartupPath वास्तव में उस निर्देशिका की बजाय कार्यशील निर्देशिका का जिक्र कर रहा है जिसकी असेंबली निष्पादित हो रही है, जैसा कि मैंने माना है। तो मुझे असेंबली की निर्देशिका में कार्य निर्देशिका सेट अप करने के लिए ProcessInfo का उपयोग करना होगा। जब मैं वीएसटीओ लिख रहा था तो मुझे इसके साथ भी समस्या थी।

तो, मेरा सवाल यह है कि, असेंबली निष्पादित करने वाली वर्तमान निर्देशिका को प्राप्त करने के लिए सबसे अच्छा, सरल और सबसे आश्वस्त तरीका क्या है, बिना किसी कर्कश (या गलतफहमी) के मैंने जो अभी उल्लेख किया है?

संपादित करें: पर AppDomain.BaseDirectory MSDN के अनुसार, ऐसा लगता है कि यह क्रम है, जो मैं नहीं करना क्या चाहते दौरान परिवर्तन किया जा सकता है (बस स्पष्ट करने के लिए: मैं निर्देशिका जो विधानसभा रहते

संपादित पाने के लिए होती , नहीं कि मैं बेस डायरेक्टरी को बदलना नहीं चाहता हूं, बल्कि, जब मैं यह सुनिश्चित करने के बिना इसे पुनर्प्राप्त करता हूं कि यह बदला गया है या नहीं)

संपादित करें: मैंने देखा है कि एक संबंधित प्रश्न बहुत पहले पोस्ट किया गया था। What would cause the current directory of an executing app to change?

उत्तर के लिए धन्यवाद दोस्तों।

उत्तर

42
System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location)) 
+0

क्या इस विधि में प्रतिबिंब शामिल है? प्रदर्शन प्रभाव के रूप में? – faulty

+0

मुझे यकीन नहीं है कि "प्रतिबिंब" और "प्रदर्शन प्रभाव" के बीच 1: 1 सहसंबंध है; यह प्रतिबिंब नामस्थान में है लेकिन असल में असेंबली में प्रतिबिंबित नहीं होता है - यह मेटाडेटा का उपयोग कर रहा है जो इसे पहले से ही जानता है। – GalacticCowboy

+12

हाँ ... इसे अपने सभी CPU चक्रों को चूसने और अपने ज़ीऑन ऑक्टा-कोर को एचपी 12 सी में बदलने के लिए इस तरह केवल एक कॉल करें। 'क्योंकि किसी को भी पता है कि प्रतिबिंब स्पॉन-ऑफ-शैतान-और-रिपोर्टर-ऑल-द-इज़-ट्रूली-एविल-इन-द-वर्ल्ड (नाम के लिए स्कॉट हंसेलमैन को क्रेडिट :)) –

9

क्या आप वास्तविक कार्य निर्देशिका, या असेंबली वाली निर्देशिका चाहते हैं? यह पूरी तरह से स्पष्ट नहीं है।

Environment.CurrentDirectory है यदि आप कार्यशील निर्देशिका चाहते हैं, या Path.GetDirectoryName(typeof(Foo).Assembly.ManifestModule.FullyQualifiedName) किसी असेंबली के स्थान को ढूंढने के लिए (या कम से कम इसका मैनिफेस्ट मॉड्यूल, जो लगभग सभी मामलों में एक ही बात होगी)।

+0

'Environment.CurrentDirectory' साथ देखना है कि खुले फ़ाइल संवाद (Winforms + WPF) सिर्फ एक अलग निर्देशिका के लिए ब्राउज़' बदल जाएगा Environment.CurrentDirectory' –

5

वहाँ भी है,

System.Reflection.Assembly.GetExecutingAssembly().CodeBase 
+0

@tafa, मेरे लिए मारो क्योंकि यह। :) @ जोन, सिस्टम भी कोशिश करें। Reflection.Assembly.GetExecutingAssembly()। स्थान – Kon

+0

जिनमें से दोनों वास्तव में उत्तर नहीं दिए गए हैं। Robinkor एक और पूरा जवाब है। – tafa

1

कैसे

के बारे में
string currentAssemblyFile = System.Reflection.Assembly.GetExecutingAssembly().Location; 

और फिर उसे वहाँ से बाहर निकालने ...

2

मैं निम्नलिखित link से कुछ इस तरह की कोशिश करेंगे:

string path; 
path = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase); 
MessageBox.Show(path); 
4

एक बालक कम:

AppDomain.Current.BaseDirectory 
+1

AppDomain होना चाहिए। CurrentDomain AppDomain.Current.BaseDirectory के बजाय .BaseDirectory। –

11

नीचे कार्यान्वयन की कोशिश करो। कोडबेस संपत्ति स्थान प्राप्त करने का सबसे विश्वसनीय तरीका है, और फिर शेष कोड इसे मानक विंडोज प्रारूप (यूआरआई के बजाय) में परिवर्तित करता है। अगर यह से का उपयोग कर आवेदन पत्र के भीतर

static public string AssemblyLoadDirectory 
{ 
    get 
    { 
     string codeBase = Assembly.GetCallingAssembly().CodeBase; 
     UriBuilder uri = new UriBuilder(codeBase); 
     string path = Uri.UnescapeDataString(uri.Path); 
     return Path.GetDirectoryName(path); 
    } 
} 
+0

यदि आपका पथ हैश में अंक है तो आपका समाधान काम नहीं करता है। – dcp

संबंधित मुद्दे

 संबंधित मुद्दे