不断读取特定字符串的文件?

时间:2014-01-23 15:16:07

标签: c# logging file-io timer

这是在C#中。

  • 有一个日志文件(log.txt),它在处理过程中不断更新。当进程完成时,最后一行写入日志文件的末尾是“Process finished!”。没有例外。

  • 我想不断读取文件,也许是每秒四次,以查看字符串是否已显示,以便我知道该过程何时完成。

  • 我想知道,做到这一点的最佳方式(简单,轻便,可靠)是什么?计时器? FileWatcherSyetem?还有别的吗?

非常感谢!

1 个答案:

答案 0 :(得分:0)

在程序集中,我使用计时器定期检查.txt文件状态,如下所示:

System.Timers.Timer _logFileCheckTimer;

    public FijiLauncherControl()

    {        // timer set up
                    _logFileCheckTimer = new System.Timers.Timer(250);  
                    _logFileCheckTimer.Enabled = true;
                    _logFileCheckTimer.Elapsed += new System.Timers.ElapsedEventHandler(_logFileCheckTimer_Elapsed);
                   _logFileCheckTimer.Start();  // start the timer

     }    

     void _logFileCheckTimer_Elapsed(object sender, EventArgs e)
        {
            if (_processOn && IsLogOn)
            {
                try
                {
                    _processFinished = CheckStatuts();  // checking file status

                    if (_processFinished) // fire event if checking status returns true
                    {
                        OnIjmFinished(EventArgs.Empty);
                        _processOn = false;
                        _logFileCheckTimer.Stop();
                    }
                }
                catch (Exception ex)
                {

                }
            }
        }

在aseembly中。如果_processFinished = CheckStatuts();返回true

,则会在dll中设置一个事件

// event delegate     public delegate void IjmFinishedEventHandler(object sender,EventArgs e);      公共事件IjmFinishedEventHandler IjmFinished; //事件处理程序

   protected virtual void OnIjmFinished(EventArgs e)
   {
      if (IjmFinished != null)   // trigger event
                IjmFinished(this, e);          
   }

在主应用程序中,应该有事件接收器,如下所示:

private FijiLauncherControl _fl; // the object of your assembly

  _fl.IjmFinished += new IjmFinishedEventHandler(_fl_IjmFinished); // event from the assembly should trigger an event handler

   void _fl_IjmFinished(object sender, EventArgs e)   // event handler
        {
            _vm.IjmFinished = true;   // a boolean var in viewmodel in main app set to be true once the event from the assembly is triggered

            //throw new NotImplementedException();
        }

那应该做的。