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

 

posted @ 2015-12-31 01:06  AshLeakey  阅读(356)  评论(0编辑  收藏  举报