动态读取文件持续显示在UI上

时间:2022-04-29 15:50:16
    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 = ;
byte[] buffer = new byte[bufferLength];
if (fsFileStream.Length > bufferLength)
fsFileStream.Position = fsFileStream.Length - bufferLength - ;
else
fsFileStream.Position = ;
fsFileStream.Read(buffer, , bufferLength); //只读取文件的一部分
List<byte> lb = buffer.ToList();
for (int i = ; i < lb.Count; i++) //循环来去除其中的换行符以免显示出来的乱七八糟
{
if (i + < lb.Count && lb[i] == && lb[i + ] == )
{
lb.Remove(lb[i + ]);
lb.Remove(lb[i]);
break;
}
else
{
lb.Remove(lb[i]);
i--;
}
}
if (lb.Count == || (lb.Count > && lb[] == )) { _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(, line.IndexOf("|") + );
LogMessageListBox.ScrollIntoView(
LogMessageListBox.Items[LogMessageListBox.Items.Count - ]);
}