2012-04-24 146 views
1

这应该是一个非常简单的修复方法,但由于某种原因我缺少一些东西。我所要做的就是获得必须写入标题的字符串生成器函数,但由于某种原因,它目前不是。C# - 使用字符串生成器将日志文件写入日志文件

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

回答

1

您可以修复它像这样

​​

UPDATE

该代码有不同的错误。两个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语句自动关闭文件并释放外部资源。

+0

我的代码比我以前的代码更好,但正如我在上面的回答中提到的那样,它仍然不能正常工作。还有其他建议吗?在此先感谢 – 2012-04-24 14:57:03

+0

必须交换'if'和'else'部分。只有在文件尚不存在的情况下才需要写入头文件,即只写入新文件。 (我在现在的例子中改了它。) – 2012-04-24 15:03:02

+0

这实际上写出了标题,但现在它只能运行我的循环并打印一次值。出于某种原因,每当我改变一件事时,我就会得到另一件事,反之亦然。无法弄清楚为什么会发生这种情况。 – 2012-04-24 15:05:37

0

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

当然其他选项是写出用于写入标头的StringBuilder的内容到dailyStats,而不是在附加字符串后不做任何事情。

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

我很抱歉,我确实有这样的代码,我只是没有意外粘贴它。但是,这仍然是由于某种原因没有解决我的问题。我仍然得到这个结果:a)标题正在打印,但它的唯一运行通过我的循环一次。 b)标题没有被打印,我的循环正在运行,通过 – 2012-04-24 14:56:11