2012-04-24 192 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