C# - 使用字符串生成器将标头写入日志文件

本文关键字:文件 日志 字符串 | 更新日期: 2023-09-27 18:32:09

这应该是一个非常容易的修复,但由于某种原因我错过了一些东西。我所要做的就是获取我必须编写标头的字符串生成器函数,但由于某种原因,它目前不是。

当我尝试将 if 语句更改为 !File.Exists(tempFileName),它不会通过我的循环运行。

有什么建议吗?另外,如果您需要更多信息,请告诉我。提前谢谢。

public static void Open(string tempFileName, string division,
                             int zipFiles, int conversions, int returnedFiles, int totalEmails)
    {
        StreamWriter dailyStats;
        //This is where I am missing something
        //I am passing in the original filename of a log, then adding "-Stats.log"
        //so I can tell the difference between what is the new stats file, and the original log file
        if (File.Exists(tempFileName))
        {
            dailyStats = new StreamWriter(tempFileName + "-Stats.log");
            StringBuilder sb = new StringBuilder();
            sb.Append("Division");
            sb.Append("'t");
            sb.Append("Zip Files");
            sb.Append("'t");
            sb.Append("Conversions");
            sb.Append("'t");
            sb.Append("Returned Files");
            sb.Append("'t");
            sb.Append("Total E-Mails");
            sb.Append("'t");
        }
        else
        {
            dailyStats = File.AppendText(tempFileName + "-Stats.log");
        }
        if (writeLog)
        {
            //Use a string builder to assemble the content for performance reasons
            StringBuilder s = new StringBuilder();
            s.Append(division);
            s.Append("'t");
            s.Append(zipFiles);
            s.Append("'t");
            s.Append(conversions);
            s.Append("'t");
            s.Append(returnedFiles);
            s.Append("'t");
            s.Append(totalEmails);
            s.Append("'t");
            dailyStats.WriteLine(s.ToString());
        }
        dailyStats.Close();
    }

C# - 使用字符串生成器将标头写入日志文件

你在第一个块中没有缺少代码吗?

dailyStats.WriteLine(sb.ToString());

因此:

    if (File.Exists(tempFileName))
    {
        dailyStats = new StreamWriter(tempFileName + "-Stats.log");
        StringBuilder sb = new StringBuilder();
        sb.Append("Division");
        sb.Append("'t");
        sb.Append("Zip Files");
        sb.Append("'t");
        sb.Append("Conversions");
        sb.Append("'t");
        sb.Append("Returned Files");
        sb.Append("'t");
        sb.Append("Total E-Mails");
        sb.Append("'t");
        // Add this ......
        dailyStats.WriteLine(sb.ToString());
    }

你可以这样修复它

var sb = new StringBuilder();
string logFileName = tempFileName + "-Stats.log";
if (File.Exists(logFileName)) {
    dailyStats = File.AppendText(logFileName); 
} else {
    dailyStats = new StreamWriter(logFileName); 
    // Write header
    sb.Append("Division");
    ...
    sb.AppendLine();
} 
if (writeLog)  {
    sb.Append(division);
    ...
    dailyStats.WriteLine(sb.ToString());
} 
dailyStats.Close();

更新

代码有不同的错误。创建了两个StringBuilders,但只有一个写入文件。确定文件是否存在的文件名与写入的实际文件不同。最后,依赖于文件存在的逻辑被颠倒了。我完全重写和重构了代码,以使其更易于理解和管理

public static void Open(string tempFileName, string division,
                     int zipFiles, int conversions, int returnedFiles, int totalEmails)
{
    if (!writeLog)
        return;
    using (StreamWriter dailyStats = OpenLogFile(tempFileName)) {
        var sb = new StringBuilder();
        sb.Append(division);
        // ...
        dailyStats.WriteLine(sb.ToString());
    }
}
private static StreamWriter OpenLogFile(string tempFileName)
{
    StreamWriter dailyStats;
    string logFileName = tempFileName + "-Stats.log";
    if (File.Exists(logFileName)) {
        dailyStats = File.AppendText(logFileName);
    } else {
        dailyStats = new StreamWriter(logFileName);
        WriteHeader(dailyStats);
    }
    return dailyStats;
}
private static void WriteHeader(StreamWriter dailyStats)
{
    var sb = new StringBuilder();
    sb.Append("Division");
    // ...
    dailyStats.WriteLine(sb.ToString());
}

注: using 语句关闭文件并自动释放外部资源。

您正在创建第二个StringBuilder并且没有对其进行任何操作。 您可能只想在更高级别定义StringBuilder,以便在任一块中附加到它都会将其添加到一个可以在末尾写出的 SB

当然,另一种选择是写出用于将标头写入dailyStatsStringBuilder的内容,而不是在附加字符串后什么都不做。