2012-04-24 2 views
1

Это должно быть очень легкое исправление, но по какой-то причине я чего-то не хватает. Все, что я пытаюсь сделать, это получить функцию String Builder, которую я должен написать заголовок, но по какой-то причине это не так.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

Вы можете это исправить, как этот

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

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

Примечание: с помощью оператор закрывает файл и освобождает внешние ресурсы автоматически.

+0

. Мне нравится этот код лучше, чем мой предыдущий код, но, как я упоминал в комментарии в ответе выше, он по-прежнему не работает по какой-то причине. Любые другие предложения? Заранее спасибо –

+0

. Часть 'if' и' else' должна быть обменена. Вы хотите написать заголовок, только если файл еще не существует, то есть только в новые файлы. (Я изменил его в моем примере сейчас.) –

+0

Это фактически выписывает заголовок, но теперь он работает только через мой цикл и печатает значения один раз. По какой-то причине, когда я меняю одну вещь, я получаю другую и наоборот. Не могу понять, почему это происходит. –

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

Прошу прощения, я действительно получил этот код, я просто не вставлял его случайно. Однако это по какой-то причине не решает мою проблему. Я все равно получаю этот результат: а) заголовок печатается, но он работает только через мой цикл один раз. b) Заголовок не печатается, и мой цикл запускается полностью через –

Смежные вопросы