我的应用程序从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()
答案 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#文件存在功能之前检查文件是否存在,或者每次运行应用程序时创建一个具有不同名称的新文件