本人正在学习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种处理思路:
在实际开发中,其实上面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,这样使用运动控制器你确定可以流畅运行???
上位机操作,一般不会循环读取文件,除非文件经常有内容变动,
可以先把文件加载到集合中,然后对集合按照需求步骤进行操作。
up,100
down,20
left,30
right,40
// 调用
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(执行方法结果为假)
退出循环,关闭文件
}
如需反复读,外层再套一个循环,设置初值为第一条记录