动态读取文件持续显示在UI上
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]); }