一个txt文件,每隔一秒有一行新的数据会写入。
我现在要做的就是监控这个txt文档,在有新的数据生成后,将它读取。
要问的问题就是,怎样在新的数据写入之后,能尽快发现,然后将这个数据(也就是txt文件的最后一行)读取。
新手提问,希望能得到帮助,思路或者代码都欢迎啊!多谢大家了!
我现在要做的就是监控这个txt文档,在有新的数据生成后,将它读取。
要问的问题就是,怎样在新的数据写入之后,能尽快发现,然后将这个数据(也就是txt文件的最后一行)读取。
新手提问,希望能得到帮助,思路或者代码都欢迎啊!多谢大家了!
解决方案 »
- c#写mysql,带参数的sql语句,但是参数始终加不进去,麻烦大家帮我解决!
- 求一正则表达式:匹配HTML的<a>标签
- 高手c#中怎么提取网页中的内容
- 如何在listBox中,选中其中的字段点击右键弹出菜单??
- 找C#高手接手做一个软件项目
- 关于页面刷新引出的问题!急!
- 关于报表的菜鸟问题?(在线等待)
- webbrowser中自动点击弹出的javascript对话框中的确认按钮,我这样写正确吗?麻烦给看看
- 如何删除XML中的接点
- 怎样得到局域网上Sql服务器名?并得其中的数据库列表。
- 关于richtextbox的自动换行读取问题
- richTextBox自动换行情况下如何按物理行号分离成字符串!
要么建立文件夹,通过System.IO.FileSystemWatcher监控这个文件夹
反正你这种处理思路本身就有问题,“每隔一秒有一行新的数据会写入”,多么频繁的IO操作
你这样还要考虑你读的时候是不是程序正在写txt,也就是访问竞争
watcher.Path = 指定目录;
watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite; watcher.Filter = "文件名.txt";watcher.Changed += new FileSystemEventHandler(OnChanged);
watcher.Created += new FileSystemEventHandler(OnChanged);
watcher.Deleted += new FileSystemEventHandler(OnChanged);
watcher.Renamed += new RenamedEventHandler(OnRenamed);
如果txt数据量太大的话(例如 上百MB),会打不开的,很消耗资源,机器会出现假死状态。
FileStream fs = new FileStream(fbd.FileName, FileMode.Open);
StreamReader sr = new StreamReader(fs);
while (true)
{
DateTime dt1 = DateTime.Now; // 获取当前时间
DateTime dt2;
double diff = 0; while (diff < 1)//一秒执行一次
{
dt2 = DateTime.Now;
TimeSpan ts = dt2.Subtract(dt1);
diff = (double)ts.TotalSeconds;
Application.DoEvents();
}
if (dataLengthToRead > fs.length)
{
Console.WriteLine(sr.ReadToEnd());
dataLengthToRead=fs.Length;
}
}
fs.Close();
sr.Close();
private void GetNewTxt(string filename)
{
long bytcount = 0;
while (true)
{
FileStream fs = new FileStream(filename, FileMode.Open,FileAccess.Read);
byte[] bytcontent = new byte[fs.Length];
if (fs.CanRead)
{
StreamReader sr = new StreamReader(fs);
long dataLengthToRead = fs.Length;//获取新的文件总大小 if (dataLengthToRead > 0 && dataLengthToRead > bytcount)
{
fs.Seek(bytcount, SeekOrigin.Begin);
int lengthRead = fs.Read(bytcontent, 0, Convert.ToInt32(dataLengthToRead - bytcount));//读取的大小
richTextBox1.AppendText(System.Text.Encoding.Default.GetString(bytcontent));//载入文本
dataLengthToRead -= lengthRead;
}
sr.Close();
fs.Close();
DateTime dtstart = DateTime.Now; // 获取当前时间
DateTime dtend;
double diff = 0;
while (diff < 5)//一秒执行一次
{
dtend = DateTime.Now;
TimeSpan ts = dtend.Subtract(dtstart);
diff = (double)ts.TotalSeconds;
Application.DoEvents();
}
}
bytcount = bytcontent.Length;//记录当次总字节数
}
}
说明下,每秒钟产生一行数据,这部分工作是由仪器设备写入txt文件的,我能做的就是从txt文件里面读取新加入的数据,然后计算处理。
另外文件的数据量并不大,一天的总数据量存放到一个txt文件里面,也就几百K。
多谢你的建议,不过写文件的权限不在我这边,我只能读这个txt文件,再处理这个数据。
为什么不弄到数据库里?即然是每秒一条条的,干脆在数据库里弄吧,时间什么的也好处理!