Проблема относительного пути 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 ответов
есть элегантное решение для этого по следующей ссылке.
поскольку моя служба работает как консоль / служба, я только что позвонил
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
, как вы хотите.