【问题标题】:Exception trying to write a LogFile using FileStream and StreamWriter尝试使用 FileStream 和 StreamWriter 写入 LogFile 时出现异常
【发布时间】:2024-12-24 23:45:01
【问题描述】:

所以基本上我编写了一个 Windows 服务,它扫描任何给定目录以查找 zip 文件,然后将其上传到 FTP 服务器。我添加了一个跟踪方法,假设写入一个 txt 文件并记录所有内容。当我将服务发布到 Windows 中时出现问题,我在事件查看器中收到一条错误消息(我使用 EventLog 类添加了一个 LogEvent),该消息返回

System.IO.IOException:进程无法访问文件 'C:\Windows\system32\traceLog.txt' 因为它正在被另一个人使用 过程。

执行跟踪的代码如下

private void EscribirTrace(string mensaje)
    {
        if (Tracing)
        {
           try
            {
              using (FileStream archivo2 = new FileStream(string.Format("{0}\\traceLog.txt", Environment.CurrentDirectory), FileMode.Append, FileAccess.Write, FileShare.ReadWrite))
                {
                    mensaje = string.Format("{0} - {1} \r\n", DateTime.Now, mensaje);

                    StreamWriter writer = new StreamWriter(archivo2);
                    writer.WriteLine(mensaje);
                    writer.Flush();
                    writer.Dispose();
                }
            }
            catch (Exception ex)
            {
                LogEvent("Error en escribir tracing", ex);
            }
        }

    }

任何想法将不胜感激

编辑 因此,经过一些研究,我认为 system32 并不是存放文件的最佳位置。我的意图是在安装了服务的路径上拥有该日志文件。经过一番研究,我更换了

Enviroment.CurrentDirectory

Path.GetFullPath(System.Reflection.Assembly.GetExecutingAssembly().Location).Replace(
                Path.GetFileName(System.Reflection.Assembly.GetExecutingAssembly().Location)

格式化成字符串。

其余的工作都很好。

感谢您的回复!

【问题讨论】:

  • 您的程序是否有权写入 system32?例如,如果将其写入桌面会发生什么?

标签: c# .net windows-services


【解决方案1】:

这是因为您的 using 语句尚未发布文件。您已将其在 Steam 中打开,因此在关闭流之前您无法写入。

如果您只想将文本写入文件,只需使用:

File.WriteAllText(FILEPATH, TEXTDATA);

该调用将打开文件,写入文件,然后关闭它。

【讨论】:

    【解决方案2】:

    如果它抛出 using ...确保文件上的所有其他流都正确关闭...

    如果它抛出 streamwriter 构造函数

    使用构造函数中的新文件流将 using 更改为流写入器

    【讨论】:

      【解决方案3】:

      /Windows/system32 需要管理员权限。您的应用程序可能没有以适当的权限运行。您应该尝试将日志写入不同的(限制较少的)位置。如果您需要写入 system32,请确保您的服务以管理员权限运行。

      【讨论】: