2009-05-19 10 views
56

मैंने एक बहुत ही सरल .NET विंडोज सेवा बनाई है और इसे InstallUtil.exe उपयोगिता का उपयोग करके स्थापित किया है।विंडोज सेवा में कौन सी निर्देशिका चलती है?

सेवा में मैं जैसे कोड का एक टुकड़ा है:

if (File.Exists("test_file.txt")) 
{ 
    // Do something clever 
} 

मैं सेवा लेकिन कोड की टिप्पणी की भाग के रूप में एक ही निर्देशिका में test_file.txt नामक एक फ़ाइल कभी नहीं किया जा रहा है बना लिया है मार डाला ...?

+0

करता है उपयोगकर्ता है कि सेवा फाइल पर सही अनुमतियां चलाता है? – CSharpAtl

उत्तर

51

सेवा नियंत्रण प्रबंधक नामक एप्लिकेशन से सेवाएं शुरू की जाती हैं। यह आवेदन प्रणाली निर्देशिका % windir% \ system32

एक विंडोज 7 अंतिम पर में रहता है - 64 बिट्स इस मार्ग वास्तव में है: % WinDir% \ SysWOW64

अधिक जानकारी के लिए Service Control Manager at MSDN देखते हैं।

धन्यवाद हार्पर शेल्बी मूल पोस्ट के साथ समस्या को इंगित करने के लिए धन्यवाद।

+1

svchost.exe अधिकांश आंतरिक विंडोज सेवाओं के लिए एक सेवा होस्ट है। सेवाएं, और गैर-विंडोज सेवाओं के मामले में सबसे अधिक संभावना है, एक अलग exe मेजबान में चला सकते हैं। – Michael

+2

सही निर्देशिका, गलत कारण। –

+1

धन्यवाद - वहां फ़ाइल को छोड़कर यह काम करता है ताकि मैं उस स्थान की पुष्टि कर सकूं: c: \ windows \ system32 – Guy

78
System.Diagnostics.Trace.WriteLine(Directory.GetCurrentDirectory()); 

वर्तमान निर्देशिका को आउटपुट करेगा। उस कोड को अपनी सेवा की स्टार्टअप विधि में रखें और आउटपुट की जांच के लिए DebugView जैसे टूल का उपयोग करें। फिर आप अपनी सेवा के स्टार्टअप फ़ोल्डर को जानेंगे।

यह सरल तकनीक सेवा विकास में कई समस्याओं के साथ उपयोगी होगी, खासकर सेवा स्टार्टअप डीबग करने के लिए।

शायद आपको उम्मीद है कि आपकी सेवा का कार्य फ़ोल्डर उस फ़ोल्डर के रूप में होगा जहां सेवा निष्पादन योग्य है (इसलिए मैंने किया)। आप कोड के निम्नलिखित लाइनों का उपयोग कर उस फ़ोल्डर में बदल सकते हैं:

System.IO.Directory.SetCurrentDirectory(System.AppDomain.CurrentDomain.BaseDirectory); 
+1

पर यह बहुत है शांत टिप - धन्यवाद! – Guy

+1

+! समस्या के अच्छे समाधान के लिए। –

11

आप यह इतना की तरह काम कर सकते हैं:

string cwd = Path.GetDirectoryName(Environment.GetCommandLineArgs()[0]); 
Directory.SetCurrentDirectory(cwd ?? "."); 
+1

+1, यह शेष एप्लिकेशन को कार्य करने की अनुमति देता है जैसे कि यह सामान्य रूप से लागू होता है .exe जहां वर्तमान निर्देशिका यह पथ है। धन्यवाद, यह वही है जो मुझे चाहिए! संबंधित पथों का उपयोग करने वाले कोड को फिर से लिखने से बचें। – Paul

2

चाहता था यह भी जानना चाहते है, जिसमें एक Windows सेवा चल रही थी, लेकिन स्रोत कोड फ़ोल्डर मेरा नहीं था इसलिए इसे संशोधित नहीं कर सका। कमांड प्रॉम्प्ट में टाइपिंग sc qc <service name> BINARY_PATH_NAME में फ़ोल्डर प्रदर्शित करता है।

C:\>sc qc 
DESCRIPTION: 
     Queries the configuration information for a service. 
USAGE: 
     sc <server> qc [service name] <bufferSize> 

जब क्वेरी MyService प्राप्त करें:

सी:> अनुसूचित जाति qc MyService

[SC] QueryServiceConfig SUCCESS 

SERVICE_NAME: MyService 
     TYPE    : 10 WIN32_OWN_PROCESS 
     START_TYPE   : 3 DEMAND_START 
     ERROR_CONTROL  : 1 NORMAL 
     BINARY_PATH_NAME : "D:\Routines\MyService\MyService.exe" 
     LOAD_ORDER_GROUP : 
     TAG    : 0 
     DISPLAY_NAME  : MyService 
     DEPENDENCIES  : 
     SERVICE_START_NAME : LocalSystem 
+0

वह मार्ग है जहां सेवा बाइनरी स्थित है, जो सेवा की "वर्तमान कार्य" निर्देशिका के बराबर होने की गारंटी नहीं है जो (सेवा) प्रक्रिया के अपटाइम के दौरान कई बार बदल सकती है। सापेक्ष फ़ाइल नाम (जैसे ओपीएस उदाहरण में) वर्तमान कार्यशील निर्देशिका के खिलाफ हल किए गए हैं, न कि निर्देशिका जहां निष्पादन योग्य बाइनरी स्थित है। –

+0

'sc qc apache2.4' दिखाता है '... BINARY_PATH_NAME:" E: \ root \ Public Cache \ Apache Httpd \ httpd-2.4.20-x86-vc11 \ Apache24 \ bin \ httpd.exe "-k runervice', लेकिन कार्यशील निर्देशिका '% WinDir% \ System32' है – Pacerier

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