2010-04-26 132 views
12

我有一个Windows服务试图从应用程序目录中访问一个XML文件。.NET Windows Service的相对路径问题..?

Windows服务安装目录:C:\ SERVICES \为MyService \ MyService.exe
路径xml文件的:C:\ SERVICES \为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 2017-04-03 09:07:50

4

你需要找到你的服务的组件的路径,像这样:

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

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

在这种情况下使用'Location'而不是'CodeBase'更加可靠...请参阅MSDN文档以获取有关信息。 – Noldorin 2010-04-26 14:37:48

+0

另一个问题是您正在使用'typeof(MyClass).Assembly'来获取程序的主要程序集。 'Assembly.GetEntryAssembly()'再次更可靠。 – Noldorin 2010-04-26 14:39:55

+0

@ Noldorin#2:恰恰相反。无论谁打电话给他的集会,他的代码都应该有效。 – SLaks 2010-04-26 14:40:13

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

该路径不会解析为C:\ Services \ MyService \ MyService.xml,哪些是必需的?我认为这只是一个错字。 – 2010-04-26 14:48:52

+0

@Waleed:对不起,你说得对。它解决了正确的道路,我只写了错误的“正确路径”。;) – Noldorin 2010-04-26 15:36:48

+0

GetAbsolutePath(string relativePath)可能是一个更好的方法名称。 – Zorayr 2013-08-08 21:43:23