如何附加到使用循环的文本文件?

时间:2015-01-05 18:07:07

标签: c# winforms

我的应用程序从SQL数据库中获取所选信息,并将其放入一个很好的列格式文本文件中。我遇到的问题是如果程序因任何原因崩溃或停止,它将在重新启动时覆盖以前的文本。

我正在尝试使用example provided by Microsoft here,但我似乎无法正确设置。

这是我用来编写文本文件的方法

private void Output()
    {           
                  string createText = 
                    FormatWidth("Severity", 10) + 
                    FormatWidth("LastNotification", 18) +
                    FormatWidth("FirstNotification", 18) + 
                    FormatWidth("DeviceIP", 18) + 
                    FormatWidth("DeviceInterface", 20) + 
                    "DescriptionShort";

        foreach (KeyValuePair<string, AlarmData> AlarmDataText in AlarmDictionary)
        {
            createText += Environment.NewLine;
            createText += 
            FormatWidth(AlarmDataText.Value.eventSeverity, 8) + 
            FormatWidth(AlarmDataText.Value.eventLastNotification.ToString("yyyy-MM-dd HH:mm"), 18) +
            FormatWidth(AlarmDataText.Value.eventFirstNotification.ToString("yyyy-MM-dd HH:mm"), 18) + 
            FormatWidth(AlarmDataText.Value.deviceIP, 18) + 
            FormatWidth(AlarmDataText.Value.deviceInterface, 20) + 
            AlarmDataText.Value.descriptionShort;
        }

        File.WriteAllText("C:\\Users\\*username*\\Documents\\Visual Studio 2010\\Projects\\NMS_Logger\\NMS_Logger\\bin\\Log.txt", createText);

        Console.WriteLine("File Updated"); //For working verification


    }//end Output()

2 个答案:

答案 0 :(得分:2)

如果你想追加,你将无法使用File.WriteAllText,所以我会这样做:

StreamWriter sw;
if (!File.Exists(outputPath)
{
    sw = new StreamWriter(outputPath, false);
    sw.WriteLine(headers);
}
else
    sw = new StreamWriter(outputPath, true);

foreach (...)
   sw.WriteLine(dataLine);

可以初始化StreamWriter以始终附加声明,但它会破坏&#34;以前的文件存在&#34;逻辑,所以我把它设置得比平常有点不同。

作为旁注,您正在进行字符串连接的批次,请考虑使用StringBuilder。如果您坚持使用该方法,可以使用File.AppendAllText,而不是在foreach中单独编写每一行。请注意,与仅将每行写入文件相比,此方法的内存效率非常低(感谢@Servy)。

此外,如果程序崩溃,您将有一个&#34;垃圾&#34;在中间的线将是非平凡的检测(为了将换行放入)。您可能希望在开始追加之前始终插入新行,即使这会在正常情况下导致数据中出现奇怪的换行符。

答案 1 :(得分:0)

在使用c#文件存在功能之前检查文件是否存在,或者每次运行应用程序时创建一个具有不同名称的新文件