Подтвердить что ты не робот

Относительный путь с .Net Windows Service..?

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

Установленный каталог 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"

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

Ответ 3

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