Относительный путь с .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"
Моя служба работает с локальной системной учетной записью, и я не хочу использовать абсолютный путь.
Ответы
Ответ 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
, как вы хотите.