2008-11-05 13 views
7

तो ... मुझे लगता था कि जब आपने फ़ाइल तक पहुंचा तो पथ के बिना नाम निर्दिष्ट किया (मेरे मामले में CAISLog.csv)। .NET अपेक्षा करता है कि फ़ाइल चल रहे .exe के समान पथ पर रहें।डिफ़ॉल्ट/सापेक्ष पथ समाधान .NET में कैसे काम करता है?

यह काम करता है जब मैं एक समाधान के माध्यम से आगे बढ़ रहा हूँ (सी # .NET2। * VS2K5) लेकिन जब मैं सामान्य मोड में अनुप्रयोग चलाने के (एक Websphere MQ उत्प्रेरक द्वारा शुरू किया गया पर नजर रखने के & एक नेटवर्क सेवा के रूप में पृष्ठभूमि में चल रहा) के बजाय उस पथ पर फ़ाइल तक पहुंचने के लिए जहां .exe को C: \ WINDOWS \ system32 पर देखा जा रहा है। यदि यह महत्वपूर्ण है तो पैरेंट टास्क का .exe लगभग उसी फ़ोल्डर संरचना/पथ में है जैसा कि मेरे ऐप

मुझे एक मिलान त्रुटि मिलती है: "सिस्टम। अनधिकृत एक्सेस अपवाद: पथ तक पहुंच 'सी: \ विन्डोज़ \ system32 \ CAISLog। सीएसवी 'अस्वीकार कर दिया गया है। "

मेरा कामकाज सिर्फ मेरी फ़ाइल के स्थान को पूरी तरह अर्हता प्राप्त करना है। मैं क्या समझना चाहता हूं, हालांकि है ".NET नियम क्या है जो यह नियंत्रित करता है कि पथ को हल किया गया है जब केवल आईओ के दौरान फ़ाइल नाम निर्दिष्ट किया गया है?" मुझे लगता है कि मुझे कुछ बुनियादी अवधारणा याद आ रही है और यह मुझे खराब कर रहा है।

संपादित करें - मुझे यकीन नहीं है कि यह एक .NET नियम प्रति है लेकिन श्मुली इस अवधारणा को थोड़ा स्पष्ट समझते हुए प्रतीत होता है। मैं निश्चित रूप से भविष्य में रॉब प्राउस के सुझावों का प्रयास करूंगा, इसलिए उस पर +1 भी।

किसी को भी कुछ फिर से शब्दों सुझाव है कि जोर देना मैं वास्तव में देखभाल मेरी .exe के लिए पथ खोजने के बारे में नहीं है है - बल्कि सिर्फ समझ में नहीं आया कि क्या रिश्तेदार पथ संकल्प के साथ चल रहा था (और मैं अभी भी हो सकता है मेरे टर्मिनॉजी खराब हो गए हैं) ...

उत्तर

10

जब एक आवेदन (WinForms) शुरू होता है, Environment.CurrentDirectory आवेदन फ़ोल्डर के लिए पथ (अर्थात कि .exe विधानसभा वाले फ़ोल्डर) शामिल हैं। किसी भी फ़ाइल संवाद का उपयोग, पूर्व। OpenFileDialog, SaveFileDialog, आदि वर्तमान निर्देशिका को बदलने का कारण बनेंगे (यदि एक अलग फ़ोल्डर चुना गया था)।

विंडोज सेवा चलाते समय, इसका युक्त फ़ोल्डर सी: \ विंडोज \ सिस्टम 32 है, क्योंकि यह सिस्टम फ़ोल्डर है और यह सिस्टम (यानी ऑपरेशन सिस्टम) है जो वास्तव में आपकी विंडोज सेवा चला रहा है।

ध्यान दें कि System.IO ऑब्जेक्ट्स में से अधिकांश में एक सापेक्ष पथ निर्दिष्ट करना, Environment.CurrentDirectory संपत्ति का उपयोग करने के लिए वापस आ जाएगा।

के रूप में उल्लेख किया है, वहाँ सेवा निष्पादन के पथ प्राप्त करने के लिए कई तरीके, Assembly.GetEntryAssembly() या Assembly.GetExecutingAssembly() और उसके बाद या तो Location संपत्ति या CodeBase संपत्ति (ध्यान रखें कि यह फ़ाइल पथ, नहीं निर्देशिका है, का हो का उपयोग कर रहे हैं निष्पादन योग्य)।

`System.IO.Directory.SetCurrentDirectory(System.AppDomain.CurrentDomain.BaseDirectory);` 

सेवा के OnStart विधि में कॉल करें, पूरे आवेदन करने के लिए इसे लागू करने:

एक अन्य विकल्प का प्रयोग है।

+0

धन्यवाद - मुझे लगता है कि यह सबसे अधिक मदद करता है –

4

सापेक्ष पथ संकल्प कभी लॉन्च करने वाले निष्पादन योग्य के मार्ग के विरुद्ध काम करता है। यह हमेशा प्रक्रिया 'वर्तमान निर्देशिका के खिलाफ काम करता है, और आप वास्तव में उम्मीद नहीं कर सकते कि हमेशा .exe में निर्देशिका को सेट किया जाए।

यदि आपको उस व्यवहार की आवश्यकता है, तो सही पथ का पता लगाने के लिए सावधानी बरतें अपने आप पर और फ़ाइल संचालन के लिए एक पूर्ण योग्य मार्ग प्रदान करते हैं।

9

यह वर्तमान कार्यशील निर्देशिका पर आधारित है जो आपके एप्लिकेशन के निवास के समान हो सकता है या नहीं, विशेष रूप से यदि किसी भिन्न प्रोग्राम से शुरू होता है या एक अलग कार्य निर्देशिका के साथ शॉर्टकट होता है।

पथ को हार्ड कोड की बजाय, अपने कार्यक्रम का मार्ग प्राप्त करें और इसका उपयोग करें। आप इसे

Assembly ass = Assembly.GetEntryAssembly(); 
string dir = Path.GetDirectoryName(ass.Location); 
string filename = Path.Combine(dir, "CAISLog.csv"); 

ऐसा कुछ मानते हैं कि प्रविष्टि असेंबली आपकी फ़ाइल है। यदि नहीं, तो आप कुछ के लिए असेंबली प्राप्त कर सकते हैं;

Assembly ass = Assembly.GetAssembly(typeof(AClassInYourAssembly)); 
+2

अगर मुझे सही याद है, विधानसभा। स्थान असेंबली के लिए पूरा पथ देता है, यानी फ़ाइल नाम सहित। तो आपको वास्तव में निर्देशिका प्राप्त करने के लिए Path.GetDirectoryName (ass.Location) को कॉल करना होगा। इसके अलावा, उत्तर के लिए +1। – OregonGhost

+0

धन्यवाद, रोब - सहायक सामान लेकिन मुझे लगता है कि श्मुली के जवाब ने मुझे जो परेशान किया था, उसकी सामान्य अवधारणा को और अधिक अंतर्दृष्टि प्रदान की। +1 –

-2

आप इस का उपयोग एक रास्ता है कि अपने exe का एक ही रास्ता में रहता है निर्दिष्ट करने के लिए कर सकते हैं @ ".. \ CAISLog.csv"। कृपया ध्यान दें कि डबल डॉट्स मूल निर्देशिका को संदर्भित करता है जहां कहीं भी आपका .exe झूठ बोलता है।

RWendi

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