C# - 使用字符串生成器将标头写入日志文件
本文关键字:文件 日志 字符串 | 更新日期: 2023-09-27 18:32:09
这应该是一个非常容易的修复,但由于某种原因我错过了一些东西。我所要做的就是获取我必须编写标头的字符串生成器函数,但由于某种原因,它目前不是。
当我尝试将 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();
}
你在第一个块中没有缺少代码吗?
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());
}
你可以这样修复它
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();
更新
代码有不同的错误。创建了两个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 语句关闭文件并自动释放外部资源。
您正在创建第二个StringBuilder
并且没有对其进行任何操作。 您可能只想在更高级别定义StringBuilder
,以便在任一块中附加到它都会将其添加到一个可以在末尾写出的 SB
当然,另一种选择是写出用于将标头写入dailyStats
的StringBuilder
的内容,而不是在附加字符串后什么都不做。