我有这个简单的代码,记录将日志附加到文本文件:
public static void RecordToFile(string filename, Log log)
{
TextWriter textWriter = new StreamWriter(Constants.APP_PATH +
"\\" + filename, true);
textWriter.WriteLine(log.ToString());
textWriter.Close();
}
这在Windows窗体应用程序中完美运行。但是,使用instsrv and srvany技巧,我将其设为Windows服务。该服务运行正常,访问数据库,执行查询和所有...除了这个StreamWriter。日志不会得到应有的更新。有什么想法吗?
答案 0 :(得分:6)
该服务很可能是在没有该目录访问权限的用户凭据下运行的。
因此,请检查服务的属性对话框,然后选中“登录”选项卡以查看其登录的内容。
答案 1 :(得分:2)
可能的原因:
答案 2 :(得分:2)
如果没有更多信息,任何人都无法提供帮助。究竟是什么方式,它不起作用?你有例外吗?它是否只是默默地失败了?
只是一些提示......
1)不要使用字符串连接来创建文件路径。请改用System.IO.Path.Combine
。像这样:
TextWriter textWriter = new StreamWriter(
System.IO.Path.Combine(Constants.APP_PATH, filename), true);
2)将您的作家封闭在using()
块中。像这样:
using(TextWriter textWriter = new StreamWriter(
System.IO.Path.Combine(Constants.APP_PATH, filename), true))
{
textWriter.WriteLine(log.ToString());
}
3)验证服务所使用的帐户是否有权访问该目录中的创建/覆盖文件。通常,LOCAL_SYSTEM
或NETWORK_SERVICE
等服务帐户不会拥有与用户帐户相同的权限。这可以解释为什么它作为用户而不是作为服务工作。也可能是您的APP_PATH常量指向用户特定的内容,例如映射到网络共享的驱动器。驱动器映射不会跨越用户,因此这也可能是一个问题。
答案 3 :(得分:0)
如果没有更多信息,我猜你的服务运行的帐户没有权利打开文件进行写作。