使用计时器逐行读取文本文件

CRI*_*501 6 c# streamreader datalog

StreamReader sr = new StreamReader("C:/CR EZ Test/Log.txt");    //use with IF
private void timer2_Tick(object sender, EventArgs e)
{
    if ((line = sr.ReadLine()) != null)
    {   
        //FileStream fs = File.Open("C:/CR EZ Test/Log.txt", FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
        //StreamReader sr = new StreamReader(fs); //use with While can't use with }else{
        //while ((line = sr.ReadLine()) != null) 
        //{
        string[] dataLog = line.Split(new[] { ',' }, StringSplitOptions.None);
        mpa = (dataLog[1]);
        ml  = (dataLog[2]);
        lph = (dataLog[3]);
        elapsedTime = float.Parse(dataLog[4]) / 1000;

        if (testStatus > 0) time = elapsedTime.ToString("0.0");
        tb2.Value = int.Parse(dataLog[6]);

        if (chart1.Series[0].Points.Count > tb1.Value && tb1.Value > 0)
        {
            chart1.Series[0].Points.RemoveAt(0);
            chart1.Series[1].Points.RemoveAt(0);
        }
        chart1.Series[0].Points.AddXY(dataLog[5], int.Parse(dataLog[1]));
        chart1.Series[1].Points.AddXY(dataLog[5], int.Parse(dataLog[6]));
        //}
    }
    else
    {
        sr.DiscardBufferedData();
        sr.BaseStream.Seek(0, SeekOrigin.Begin);
        sr.BaseStream.Position = 0;
        //sr.Close();
        //alertTB.Text = "";
        timer2.Enabled = false;
    }
    alertTB.ForeColor = Color.Red;
    alertTB.Text = "Data Log Viewing In Progress";
}
Run Code Online (Sandbox Code Playgroud)

问题是我正在通过GUI读取一个充满变量的文本文件,比如重放视频.当代码显示时,它可以工作,我可以控制计时器滴答来改变重放速度.问题是文件正在使用中,因此我无法在文件正在使用时写入或删除文本,而无需先关闭文件.我希望能够找到Streamreader的解决方法,或使用Filestream to Streamreader代码,这将允许我在使用时编辑该文件.问题是,我无法弄清楚如何使它与计时器一起工作,它只是非常快速地读取整个文件.非常感谢任何帮助或想法.

这里的问题是如何将注释掉的代码:

  1. 读一行文本文件,
  2. 有计时器打勾
  3. 然后读取文本文件的下一行,依此类推.显然在数据到达时处理数据.

CRI*_*501 2

行之有效的解决方案

 string line;
        if (!File.Exists(logFile))
        {
            viewLog.Text = "Play";
            alertTB.ForeColor = Color.Red;
            alertTB.Text = "File Does Not Exist | Log Data To Create File";
            chart.Text = "Scope On";
        }

        if (File.Exists(logFile))
        {
            var lineCount = File.ReadLines(logFile).Count();//read text file line count to establish length for array
            if (lineCount < 2)
            {
                viewLog.Text = "Play";
                alertTB.ForeColor = Color.Red;
                alertTB.Text = "File Exists | No Data Has Been Recorded";
                chart.Text = "Scope On";
            }

            if (counter < lineCount && lineCount > 0)//if counter is less than lineCount keep reading lines
            {
                line = File.ReadAllLines(logFile).Skip(counter).Take(lineCount).First();

                string[] dataLog = line.Split(new[] { ',' }, StringSplitOptions.None);
                //-----------------------------------------Handling my data 
                counter++;
            }
            else
            {
                counter = 0;
                timer2.Enabled = false;
            }
        }
Run Code Online (Sandbox Code Playgroud)

这是我得到的修复,它允许编辑文件或删除文件的内容。我在尝试加载文件之前获取了行数。然后我使用计数器迭代这些行。我可以根据计时器刻度间隔更改下一行读取之间的延迟、暂停或停止。