我有这个简单的代码,记录将日志附加到文本文件:

    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和srvany 技巧,我将其设为Windows服务。该服务运行正常,访问数据库,执行查询和所有...除了这个StreamWriter。日志不会得到应有的更新。有什么想法吗?

有帮助吗?

解决方案

该服务很可能是在没有该目录访问权限的用户凭据下运行的。

因此,请检查服务的属性对话框,然后选中“登录”选项卡以查看其登录的内容。

其他提示

可能的原因:

  1. Constants.APP_PATH指向映射的驱动器 - 服务不在与登录用户相同的环境中运行,因此路径可能无效
  2. 权限 - 取决于运行该服务的用户,它可能无法访问WinForms应用程序所执行的同一组目录

如果没有更多信息,任何人都无法提供帮助。究竟是什么方式,它不起作用?你有例外吗?它是否只是默默地失败了?

只是一些提示......

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常量指向用户特定的内容,例如映射到网络共享的驱动器。驱动器映射不会跨越用户,因此这也可能是一个问题。

如果没有更多信息,我猜你的服务运行的帐户没有权利打开文件进行写作。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top