2010-04-26 133 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