2010-04-26 12 views
12

मेरे पास एक विंडोज सेवा है जो अनुप्रयोग निर्देशिका से एक्सएमएल फ़ाइल तक पहुंचने का प्रयास कर रही है।नेट विंडोज सेवा के साथ सापेक्ष पथ मुद्दा ..?

Windows सेवा स्थापित निर्देशिका: C: \ सेवाएं \ MyService \ MyService.exe
की xml फ़ाइलपथ: C: \ सेवाएं \ MyService \ MyService.xml

मैं उपयोग करने के लिए कोशिश कर रहा हूँ निम्न कोड का उपयोग कर फ़ाइल।

using (FileStream stream = new FileStream("MyService.xml", FileMode.Open, FileAccess.Read)) 
    { 
     //Read file   
    } 

मुझे निम्न त्रुटि मिलती है।

"फ़ाइल नहीं मिली: C: \ WINDOWS \ system32 \ MyService.xml"

मेरी सेवा स्थानीय सिस्टम खाते के साथ चल रहा है और मैं निरपेक्ष पथ का उपयोग नहीं करना चाहते हैं।

उत्तर

22

निम्न लिंक से इसके लिए एक सुरुचिपूर्ण समाधान है।

http://haacked.com/archive/2004/06/29/current-directory-for-windows-service-is-not-what-you-expect.aspx/

मेरी सेवा के रूप में दोनों के रूप में सांत्वना/सेवा चल रही है सेवा जैसे के रूप में यह चलाने से पहले मैं सिर्फ

Directory.SetCurrentDirectory(AppDomain.CurrentDomain.BaseDirectory) 

बुलाया

static void Main(string[] args) 
     { 
      if (args.Length == 0) 
      { 
       Directory.SetCurrentDirectory(AppDomain.CurrentDomain.BaseDirectory); 
       RunAsService(); 
      } 
      else 
      { 
       RunAsConsole(); 
      } 
     } 
+0

मेरे जीवन को बचाया .. – user2617750

4

आप, आपकी सेवा के विधानसभा के लिए पथ खोजने की जरूरत है इस तरह:

static readonly string assemblyPath = 
    Path.GetDirectoryName(typeof(MyClass).Assembly.Location); 

using (FileStream stream = File.OpenRead(Path.Combine(assemblyPath, "MyService.xml")) 
+0

'कोडबेस' के बजाय इस मामले में 'स्थान' का उपयोग करना अधिक विश्वसनीय है ... जानकारी के लिए एमएसडीएन दस्तावेज़ देखें। – Noldorin

+0

एक और समस्या यह है कि आप प्रोग्राम की मुख्य असेंबली पाने के लिए 'टाइपोफ (माइक्लास) .ssembly' का उपयोग कर रहे हैं। 'असेंबली। गेटएन्ट्रीएस्परब्स() 'फिर से अधिक विश्वसनीय है। – Noldorin

+0

@ नोल्डोरिन # 2: इसके विपरीत। उनके कोड को काम करना चाहिए चाहे कोई भी अपनी असेंबली कहलाता हो। – SLaks

2

जब एक Windows सेवा शुरू की है, वर्तमान निर्देशिका, प्रणाली निर्देशिका है के रूप में आप वास्तव में खोजने लगते हैं। यह वर्तमान निर्देशिका है जिसका उपयोग सापेक्ष पथ को पूर्ण पथ में हल करने के लिए किया जाता है, न कि आपके एप्लिकेशन (सेवा) निर्देशिका। (Environment.CurrentDirectory चर पता लगाएं कि आपको इस बात की पुष्टि करना चाहते हैं।)

निम्नलिखित सहायक विधि काम यहाँ में आ सकता है:

public static string GetAppRelativePath(string path) 
{ 
    return Path.Combine(Path.GetDirectoryName(
     Assembly.GetEntryAssembly().Location), path); 
} 

जो तुम तो के रूप में उपयोग कर सकते हैं:

using (FileStream stream = new FileStream(Utilities.GetAppRelativePath(
    "MyService.xml"), FileMode.Open, FileAccess.Read)) 
{ 
    // Read file 
} 

पथ फिर आप चाहते हैं कि C:\Services\MyService\MyService.xml को हल करेंगे।

+1

सी: \ Services \ MyService \ MyService.xml के पथ को हल नहीं करेगा, जो आवश्यक है? मुझे लगता है कि यह सिर्फ एक टाइपो है। –

+0

@Waleed: क्षमा करें, आप सही हैं। यह सही रास्ते पर हल करता है, मैंने अभी गलत 'सही पथ' लिखा है।;) – Noldorin

+0

GetAbsolutePath (स्ट्रिंग सापेक्षपैथ) एक बेहतर विधि नाम हो सकता है। – Zorayr

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