2

这应该是一个非常容易解决的问题,但由于某种原因,我遗漏了一些东西。我要做的就是获取我必须编写标题的字符串生成器函数,但由于某种原因它目前不是。

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

3 回答 3

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());
    }
于 2012-04-24T14:21:50.953 回答
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 语句关闭文件并自动释放外部资源。

于 2012-04-24T14:30:16.690 回答
0

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

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

于 2012-04-24T14:21:09.430 回答