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

时间:2012-04-24 14:18:29

标签: c# string file logging builder

这应该是一个非常简单的修复,但由于某种原因我错过了一些东西。我想要做的就是获得我必须编写标题的字符串生成器函数,但由于某种原因它当前不是。

当我尝试将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();
    }

3 个答案:

答案 0 :(得分:5)

您是否错过了第一个区块中的代码?:

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());
    }

答案 1 :(得分:1)

您可以像这样修复

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语句会关闭文件并自动释放外部资源。

答案 2 :(得分:0)

你正在创建第二个StringBuilder而没有做任何事情。您可能只想在更高级别定义StringBuilder,以便在任何一个块中追加它都将其添加到一个可以在最后写出的SB。

另一个选择当然是写出用于将标题写入StringBuilder的{​​{1}}的内容,而不是在附加字符串后不执行任何操作。