private void DisplayLogInfo(FileInfo _LastFile)
{
if (_LastFile != null)
{
StreamReader sr = null;
try
{
UpdateUIDelegate uuDelegate = new UpdateUIDelegate(UpdateUI); //定义委托来存放更新UI的方法
if (File.Exists(_LastFile.FullName))
{
using (
FileStream fsFileStream = new FileStream(_LastFile.FullName, FileMode.Open, FileAccess.Read,
FileShare.ReadWrite))//这样打开文件来避免同时访问的冲突
{
if (_logReadPosition == fsFileStream.Length) return;
int bufferLength = 8192;
byte[] buffer = new byte[bufferLength];
if (fsFileStream.Length > bufferLength)
fsFileStream.Position = fsFileStream.Length - bufferLength - 1;
else
fsFileStream.Position = 0;
fsFileStream.Read(buffer, 0, bufferLength); //只读取文件的一部分
List<byte> lb = buffer.ToList();
for (int i = 0; i < lb.Count; i++) //循环来去除其中的换行符以免显示出来的乱七八糟
{
if (i + 1 < lb.Count && lb[i] == 13 && lb[i + 1] == 10)
{
lb.Remove(lb[i + 1]);
lb.Remove(lb[i]);
break;
}
else
{
lb.Remove(lb[i]);
i--;
}
}
if (lb.Count == 0 || (lb.Count > 0 && lb[0] == 0)) { _logReadPosition = fsFileStream.Length; return; }
buffer = lb.ToArray();
MemoryStream ms = new MemoryStream(buffer);
sr = new StreamReader(ms);
string line;
LogMessageListBox.Items.Clear();
while ((line = sr.ReadLine()) != null && !line.StartsWith("\0")) //读取的时候发现有不少乱码,去掉其中\0开始的行
{
this.Dispatcher.BeginInvoke(uuDelegate, line); //异步调用来把Line显示到界面上,当文件更新太快时(<100ms)这个方法好像还不太适用
}
_logReadPosition = fsFileStream.Length;
}
}
}
finally
{
if (sr != null)
sr.Close();
}
}
}
private void UpdateUI(string line)
{
this.LogMessageListBox.Items.Add(line);
this.tbLogMessage.Text = line.Remove(0, line.IndexOf("|") + 1);
LogMessageListBox.ScrollIntoView(
LogMessageListBox.Items[LogMessageListBox.Items.Count - 1]);
}