我有一个Windows服务,它试图从Application目录访问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”
我的服务使用本地系统帐户运行,我不想使用绝对路径。
答案 0 :(得分:27)
通过以下链接有一个优雅的解决方案。
由于我的服务作为控制台/服务运行,我刚刚调用
Directory.SetCurrentDirectory(AppDomain.CurrentDomain.BaseDirectory)
在将其作为服务运行之前
static void Main(string[] args)
{
if (args.Length == 0)
{
Directory.SetCurrentDirectory(AppDomain.CurrentDomain.BaseDirectory);
RunAsService();
}
else
{
RunAsConsole();
}
}
答案 1 :(得分:4)
您需要找到服务程序集的路径,如下所示:
static readonly string assemblyPath =
Path.GetDirectoryName(typeof(MyClass).Assembly.Location);
using (FileStream stream = File.OpenRead(Path.Combine(assemblyPath, "MyService.xml"))
答案 2 :(得分:4)
启动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
。