我正在读取多个日志文件并将这些行附加到一个StringBuilder
对象。但是,有些行有时髦的字符,这会导致 StringBuilder 静默失败。我相信它会附加最后一行(带有违规字符),但之后根本不会附加任何行。没有抛出异常......要么我错误地使用 StringBuilder 要么这是一个错误。
我在操作结束时在文本框中显示 StringBuilder 的内容。这是我当前输出的末尾(是的,它已经过消毒......):
[2556 0903 141433250 ram] 8 GB of RAM
[2556 0903 141433250 cpu] wicked fast CPU!
[2556 0903 141433640 xyz] a�b��������k'�
在最后一个日志行之后应该有更多的输出。当我在 Visual Studio 中逐行调试此行时,当我到达Append()
最后一个日志之后的行时,什么也没有发生 - 它被命中但字符串没有被修改(它甚至不会像变量一样在 Locals 窗口中变成红色当它们的值发生变化时)。非常奇怪的行为!
以下是我的代码的相关部分。您会看到我有两个 StringBuilder 对象:一个构建数据库字符串,我从中提取元数据 ( odbcResultsRaw
),另一个使用元数据构建实际内容以查找适当的日志文件 ( odbcResultsNice
)。fileReaders
是自定义 StreamReaders 的字典:
OdbcDataReader dbReader = com.ExecuteReader();
while (dbReader.Read())
{
string fileName = dbReader[1].ToString(); // source file
int fileLineNum = int.Parse(dbReader[2].ToString()); // line number in source file
// grab the appropriate StreamReader, not important...
CustomStreamReader fileReader = fileReaders[fileName];
string line = String.Empty;
// navigate to the correct line, not important...
while (fileReaders[fileName].currentLineNum < fileLineNum)
{
// read in line from log file; where the magic happens
line = fileReaders[fileName].ReadLine();
fileReaders[fileName].currentLineNum++;
}
odbcResultsRaw.AppendLine(fileName + ", " + fileLineNum.ToString());
odbcResultsNice.AppendLine(line);
}
odbcResultsRaw 始终有效;那是微不足道的。但是 odbcResultsNice 会像上面描述的那样死掉。最后,我可能有 7,000 行用于 odbcResultsRaw,但只有几百行用于 odbcResultsNice - 这表明代码确实会继续运行,至少。
我相信我有两个选择:“修复” StringBuilder(或了解我是否以非预期的方式使用它)或弄清楚如何忽略违规行。想知道你的想法和建议。
注意:我不知道何时会遇到包含这些字符的文件或行。我不确定它们是不同的编码还是只是随机垃圾。