Проблема относительного пути with.Net служба Windows..?

У меня есть служба windows, которая пытается получить доступ к xml-файлу из каталога приложений.

установленный каталог службы Windows : C:ServicesMyServiceMyService.exe
путь к xml-файлу : C:ServicesMyServiceMyService.в XML

Я пытаюсь получить доступ к файлу, используя следующий код.

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

Я получаю следующую ошибку.

" Не удается найти файл : C:WINDOWSsystem32MyService.XML-код"

моя служба работает с локальной системной учетной записью, и я не хочу использовать абсолютный путь.

3 ответов


есть элегантное решение для этого по следующей ссылке.

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();
            }
        }

вам нужно найти путь к месту службы агрегата, так:

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

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

при запуске службы 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, как вы хотите.