C#文件经常打开,已打开异常

Thi*_*ngs 0 c# exception

嘿所以我有一个经常被调用的记录器类,有时当它被反复调用时会抛出一个异常,该文件已被打开,被另一个应用程序使用.我们找到解决方法的唯一方法是捕获异常,然后尝试再次打开它......我不确定如何正确处理这个问题.

    /// <summary>
    /// Open a log file based on a date
    /// </summary>
    /// <param name="date"> Date of the file to open </param>
    public static void OpenLogFile(DateTime date)
    {
        while (true)
        {
            try
            {
                logStream = File.Open("Logs/ems." + date.ToString("yyyy-MM-dd") + ".log", FileMode.Append);
                break;
            }
            catch
            {
                continue;
            }
        }
    }




    /// <summary>
    /// Writes to a log file the specified input
    /// </summary>
    /// <param name="input"> Content to write to the log file </param>
    public static void Log(string className, string methodName, string input)
    {
            OpenLogFile(DateTime.Now);

            using (StreamWriter s = new StreamWriter(logStream))
            {
                s.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + '[' + className + '.' + methodName + "] " + input);
            }

            CloseLogFile(); 
    }




    /// <summary>
    /// Closes the current log file
    /// </summary>
    public static void CloseLogFile()
    {
        if (logStream != null)
        {
            logStream.Close();
            logStream = null;
        }
    }
Run Code Online (Sandbox Code Playgroud)

Jon*_*art 6

由于这是一个日志文件,我认为明显(和正确)的解决方案是在程序执行期间保持文件处于打开状态.

如果您不想使用已经实现的第三方记录器,例如Apache的log4net,您可以编写自己的小记录器类,该类使用线程安全机制将行写入文件.

它可能是一个static阶级或单身.通常,程序开头和结尾的执行是可以预测的,因此应该清楚初始化的位置,并关闭对象/类.

  • 确保在每次写入后使用flush(因此日志保持最新). (2认同)