根据操作结果逐行读取

本人正在学习C#上位机运动控制编程,现在遇到了一个问题,还请各位指点迷津,具体操作是这样的:有一个文本文件,首先读取一行,根据读取的内容调用某个方法,等方法执行完毕,再根据方法返回的结果决定是否继续读取下一行,直到整个文件读取完毕,再从第一步开始循环执行,除非人为干预才能停止,请各位给指点指点,感激不尽!感激不尽!

也只是一个简单的思路,仅供参考

using var stream = new StreamReader(fileName, Encoding);
while(true)
{
    if(是否退出)
    {
        是
        break;
    }
    
    while(true)
    {
        if(是否退出)
        {
            是
            return;
        }
        
        if(stream.EndOfStream)
        {
            stream.BaseStream.Seek(0, SeekOrigin.Begin);
        }
        
        var line = stream.ReadLine();
        if(!string.IsNullOrWhiteSpace(line))
        {
           var isContinue = 根据读取的内容调用某个方法(line);
           
           if(!isContinue)
           {
               方法返回的结果决定不继续读取下一行,自行决定
               return;
           }
        }
    }
}

             string path = @"G:\Desktop\QuartzSideA-film_1.txt";
              StreamReader sr = new StreamReader(path, Encoding.Default);
            String line;
            while ((line = sr.ReadLine()) != null)
            {
                根据读取的line 调用某个方法
                IF(调用的返回false)
                            break 跳出循环
               返回true的话继续读取下一行
            }

解决思路
先读取文本,然后获取每行数据,获取一行数据是,执行数据方法,循环读完即可
代码

            StreamReader sr = new StreamReader(this.txt_FilePath.Text, Encoding.UTF8);
            string line = sr.ReadLine();
            while (line != null)
            {
//line是获取的值,具体执行什么方法,得需要根据你的需求定
       
                line = sr.ReadLine();
            }
            sr.Close();

利用StreamReader工具类,调用readline 方法进行逐行读取。

大致是这样的一个流程(伪代码):

文件读取处理实现(可以是直接读行,也可以直接读到内存,按行分成 命令字符串 数组或者说列表)
{
对每行命令字符串进行处理
if (     处理每行结果信息 ) break; 
} 直到 ( 所有行处理完)

对于人工干预才能停止,大概是2种处理思路:

  1. 在循环代码中,每行处理开头设置人工干预状态检测机制,人工干预了,当前处理行就受到影响,否则需要等待处理下一行才能响应,即这样的机制保证每行开始处理了,就要完成
  2. 在开发中对人工干预设置中断处理,任何时候人工干预了,马上中断处理流程,这种机制下,即使一行已经开始处理,也可能随时停止

在实际开发中,其实上面2种干预机制都可能用到,因为具体执行过程中2种机制的影响是不同的,要根据实际情况具体分析。

using (StreamReader sr = File.OpenText("文件路径"))
{
        while (!sr.EndOfStream)
        {
              var txt = sr.ReadLine();
               // 你的业务逻辑
              // 判断是否继续读取下一行
              bool nextLine = DoSomething();
              if(!nextLine)
              {
                  break;
              }
        }
} 

代码大致结构如下,如果朋友还需要反复读,外层再套一个循环,设置初值为第一条记录就可以了
while(true)
{
if(是否退出)
{

return;
}
………(芭拉芭拉)

直接while循环 file.readline,这样使用运动控制器你确定可以流畅运行???

上位机操作,一般不会循环读取文件,除非文件经常有内容变动,
可以先把文件加载到集合中,然后对集合按照需求步骤进行操作。

下面是 operation.txt 文件内容

up,100
down,20
left,30
right,40

img

        // 调用
         private void button1_Click(object sender, EventArgs e)
        {
            if (LoadFile())
            {
                Start = true;
                Thread td = new Thread(() => DoOperation()) { IsBackground = true };
                td.Start();
            }
        }
        /// <summary>
        /// 存储文件命令
        /// </summary>
        Dictionary<string, string> _data;
        /// <summary>
        /// 加载文件
        /// </summary>
        /// <returns></returns>
        public bool LoadFile()
        {
            try
            {
                _data = new Dictionary<string, string>();
                string path = @"E:\Workspaces\Gitee\Kingdee\YC\YC.Demo\OA_API\operation.txt";
                using (StreamReader sr = new StreamReader(path, Encoding.Default))
                {
                    int err = 0;
                    while (!sr.EndOfStream)
                    {
                        string readStr = sr.ReadLine();//读取一行数据

                        if (!string.IsNullOrEmpty(readStr) && readStr.Contains(","))
                        {
                            var sp = readStr.Split(',');
                            _data.Add(sp[0], sp[1]);
                        }
                        else
                        {
                        }
                    }
                }
                if (_data != null && _data.Count > 0)
                {
                    Console.WriteLine("加载成功!");
                    return true;
                }
                else
                {
                    return false;
                }
            }
            catch (Exception)
            {
                return false;
            }
        }

  /// <summary>
        /// 开关量,前台写个按钮,控制 是否停止
        /// </summary>
        bool Start = false;
        /// <summary>
        /// 执行操作
        /// </summary>
        public void DoOperation()
        {
            while (true)
            {
                if (Start)
                {
                    bool res = false;
                    foreach (var item in _data)
                    {
                        switch (item.Key.ToLower())
                        {
                            case "up":
                                res = Operation_Up(item.Value);
                                if (res)
                                {
                                    // 返回结果成功 处理
                                }
                                else
                                {
                                    // 返回结果失败 处理
                                }
                                break;
                            case "down":
                                res = Operation_Down(item.Value);
                                if (res)
                                {
                                    // 返回结果成功 处理
                                }
                                else
                                {
                                    // 返回结果失败 处理
                                }
                                break;
                            case "left":
                                res = Operation_Left(item.Value);
                                if (res)
                                {
                                    // 返回结果成功 处理
                                }
                                else
                                {
                                    // 返回结果失败 处理
                                }
                                break;
                            case "right":
                                res = Operation_Right(item.Value);
                                if (res)
                                {
                                    // 返回结果成功 处理
                                }
                                else
                                {
                                    // 返回结果失败 处理
                                }
                                break;
                            default:
                                break;
                        }
                    } 
                }
                Thread.Sleep(100);
            }
        }

#region 命令操作
        public bool Operation_Up(string para)
        {
            // do something
            Console.WriteLine("UP:" + para);
            return true;
        }
        public bool Operation_Down(string para)
        {
            // do something
            Console.WriteLine("Down:" + para);
            return true;
        }
        public bool Operation_Left(string para)
        {
            // do something
            Console.WriteLine("Left:" + para);
            return true;
        }
        public bool Operation_Right(string para)
        {
            // do something
            Console.WriteLine("Right:" + para);
            return true;
        } 
        #endregion

首先写一个定时器,每隔固定时间执行你的方法,读取文件判断内容,然后决定是否执行调用某个方法,满足则调用,不满足继续读取下一行,大致代码如下

public Dictionary<string,string> GetSourceDisksElements(String section)
{
        section = "[" + section;
        Dictionary<string, string> keyToValue = new Dictionary<string, string>();
        //打开文件流,开始读取文件
        using (StreamReader sin = new StreamReader(new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read)))
        {
            for (String str = sin.ReadLine(); str != null; str = sin.ReadLine())
            {
                if (判断条件) //判断是否满足条件
                {
                    dosomething();
                }
            }
        }
        return keyToValue;
}


先定义一个类:
//定义类开始
class ReadTxtFileLine
    {    //本类用于使用StreamReader.Read()方法,实现逐行读取文本文件,
        int _IsReadEnd = 0;  //文件读取的状态,当为false时,代表未读完最后一行,true为读完了最后一行
        System.IO.StreamReader sr1;
        int _LoopRowNumNow = 0;
        //定义了一个是否读到最后的属性,数据类型为整数
        public int IsReadEnd { get => _IsReadEnd; }
        //构造函数
        public ReadTxtFileLine(string TxtFilePath, Encoding FileEncoding)
        {
            sr1 = new System.IO.StreamReader(TxtFilePath, FileEncoding);
            _IsReadEnd = 1;
        }
        //成员方法,执行一次,返回1行的结果,当全部读完,依然执行该方法,将返回空字符串""
        public string GetLineStr()
        {
            string strLine = "";
            int charCode = 0;
            while (sr1.Peek() > 0)
            {
                charCode = sr1.Read();
                if (charCode == 10)  //发现换行符char10就返回拼接字符串
                {
                    _LoopRowNumNow++;
                    return strLine;
                }
                else
                {
                    if (charCode != 13)
                    {    //将一行的数据重新拼接起来
                        strLine += ((char)charCode).ToString();
                    }
                }
            }
            _IsReadEnd = -1;
            sr1.Close();
            sr1.Dispose();
            return strLine;
        }
    }

功能实现
  string path = @"D:\测试样例.txt";
            Encoding encoding = UTF8Encoding.UTF8;
            ReadTxtFileLine ReadTxtFileTest1 = new ReadTxtFileLine(path, encoding);

            while (ReadTxtFileTest1.IsReadEnd>0)//文件尾退出
            {
                string str = ReadTxtFileTest1.GetLineStr();  //这里将读出来的1行赋值给str
                if(str =="edit")
                  edit();
               if(str =="midify")
                  midify();
              if(str =="exit")
                  exit();

            }

            Console.ReadLine();

用指令判断返回的结果
再进行下一步操作

文本读的方式打开文件
循环(非文件尾)
{读一行
if(执行方法结果为假)
退出循环,关闭文件

如需反复读,外层再套一个循环,设置初值为第一条记录