标题:C#如何实现读取一个实时更新的文本文件
只看楼主
jayoung
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2011-9-21
结帖率:0
已结贴  问题点数:20 回复次数:6 
C#如何实现读取一个实时更新的文本文件
最近遇到比较棘手的问题,有一个文本文件是实时更新的,有另外一个程序实时地往该文本文件里写入内容。现在需要的是实现:从这个实时更新的文件中,读取里面的内容,并在控制台中显示。
搜索更多相关主题的帖子: 文本文件 
2011-09-21 20:54
wangnannan
Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18
等 级:贵宾
威 望:87
帖 子:2545
专家分:9359
注 册:2007-11-3
得分:5 
文件读取就不用说了吧 相信楼主自己能解决 关键在于读取文件时候 判断文件是否被锁定 如果锁定则不读取
楼主可以考虑用一个线程不断读取文件 并显示 判断是否锁定可以这样做

以独占方式尝试打开文件
File.Open(path,   FileMode.Open,   FileAccess.Read,   FileShare.None)
被锁定了会抛异常

出来混,谁不都要拼命的嘛。 。拼不赢?那就看谁倒霉了。 。有机会也要看谁下手快,快的就能赢,慢。 。狗屎你都抢不到。 。还说什么拼命?
2011-09-22 08:11
xydddaxia
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:33
帖 子:466
专家分:2307
注 册:2009-3-20
得分:5 
//如果目标程序有输出,则可用用控制台启动它,把它的输出直接导向控制台,直接就看见了,
程序代码:
static void Main(string[] args)
        {
            try
            {
                Console.Title = "监视台";
                    Process P = new Process();
                    P.StartInfo.FileName = "程序路径";
                    P.StartInfo.UseShellExecute = false;
                    P.StartInfo.RedirectStandardOutput = true;
                    Console.WriteLine(">>[" + DateTime.Now.ToString() + "]启动程序\r\n");
                    P.Start();
                    string strmsg = "";
                    while (!P.StandardOutput.EndOfStream)
                    {
                        strmsg = P.StandardOutput.ReadLine();
                        if (strmsg != "")
                        {
                            Console.WriteLine(">>[" + DateTime.Now.ToString() + "]" + strmsg + "\r\n");
                        }
                    }
                    Console.WriteLine("按任意键退出.");
                   
                    Console.ReadKey(true);
             }
            catch
            {
   
            }
     }




[ 本帖最后由 xydddaxia 于 2011-9-28 13:35 编辑 ]

站在春哥的肩膀上
2011-09-22 11:38
heliyi
Rank: 4
来 自:安徽省黄册市
等 级:业余侠客
帖 子:44
专家分:260
注 册:2011-7-29
得分:5 
设置一个定时器,按一定时间间隔,获取文件的修改时间。若文件修改时间与上一次修改时间不同,则读取文本并显示。
2011-09-22 23:18
jeanine123
Rank: 3Rank: 3
等 级:论坛游侠
威 望:2
帖 子:65
专家分:192
注 册:2011-9-17
得分:5 
学习一下,不错的帖子。
2011-09-23 09:09
xydddaxia
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:33
帖 子:466
专家分:2307
注 册:2009-3-20
得分:0 
用FileSystemWatcher监视目标文件,如果被修改,立马读取,而不用考虑盲目读取了
FileSystemWatcher fileSystemWatcher1;

//开始监视
private void Init()
{
  FileSystemWatcher fileSystemWatcher1 =new FileSystemWatcher();
  this.fileSystemWatcher1.Created += new FileSystemEventHandler(fileSystemWatcher1_Created);
  this.fileSystemWatcher1.Changed += new FileSystemEventHandler(fileSystemWatcher1_Changed);

  this.fileSystemWatcher1.EnableRaisingEvents = true;
  this.fileSystemWatcher1.Path = "监视路径";
  this.fileSystemWatcher1.Filter = "*.txt";
  this.fileSystemWatcher1.IncludeSubdirectories = false;//不监视子目录
}

private void fileSystemWatcher1_Changed(object sender, e)     
 {
    if(e.FullPath=="目标文件")
    {
       //监视到目标文件被修改
    }
}

private void fileSystemWatcher1_Created(object sender, e)
 {
   if(e.FullPath=="目标文件")
    {
       //监视到目标文件被创建
    }
}


[ 本帖最后由 xydddaxia 于 2011-9-28 13:36 编辑 ]

站在春哥的肩膀上
2011-09-23 09:25
wangnannan
Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18
等 级:贵宾
威 望:87
帖 子:2545
专家分:9359
注 册:2007-11-3
得分:0 
楼上的好办法 这种解决方法能够满足绝大部分的需求,但是对于监视数量巨大的文件会有性能问题,Dictionary的性能会随着文件数量的增加而降

出来混,谁不都要拼命的嘛。 。拼不赢?那就看谁倒霉了。 。有机会也要看谁下手快,快的就能赢,慢。 。狗屎你都抢不到。 。还说什么拼命?
2011-09-23 09:58



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-350527-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.053459 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved