.NET Windows Service的相对路径问题..?
问题描述:
我有一个Windows服务试图从应用程序目录中访问一个XML文件。.NET Windows Service的相对路径问题..?
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”
我的服务与本地系统帐户运行,我不想使用绝对路径。
答
下面的链接提供了一个优雅的解决方案。
由于我的服务正在运行,它作为服务例如之前同时运行的控制台/服务,我只是叫
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
。
拯救了我的生命.. – user2617750 2017-04-03 09:07:50