Проблема относительного пути с .Net Windows Service ..? - PullRequest
15 голосов
/ 26 апреля 2010

У меня есть служба 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"

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

Ответы [ 3 ]

27 голосов
/ 26 апреля 2010

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

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();
            }
        }
4 голосов
/ 26 апреля 2010

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

4 голосов
/ 26 апреля 2010

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

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

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