FileSystemWatcher不会在文本文件更改时触发,以及如何将附加行添加到面板中

时间:2017-01-24 11:53:29

标签: filesystemwatcher

如果可能的话,我会得到一些帮助或指导。

我正在尝试实时监控文本文件,并将附加的文本复制到Windows窗体中的面板中。

文本文件正在通过exe文件进行更新,因此可能会在快速会话中添加几行,或者几分钟内不会添加任何内容。

我已经尝试过FileSystemWatcher,但它似乎无法正常工作我无法理解,而且我对这个事件处理程序等非常新,并且仍然在学习进展:(

 private FileSystemWatcher watcher = new FileSystemWatcher();
 public async void StandardOutputHandler(object sender, DataReceivedEventArgs outLine)
    {

        if (outLine.Data != null && !String.IsNullOrWhiteSpace(outLine.Data))  //checks if line coming from CMD is blank or empty
        {              

                // check if cmd output was redirected into a log file
                if (outLine.Data.Contains(">>"))
                {

                    BeginInvoke(new MethodInvoker(() =>
                    {
                        //get log path and name
                        string[] commandLine = outLine.Data.Split('>');
                        this.logFileFullPath = commandLine[3];
                        this.logFileFullPath = this.logFileFullPath.Replace('"', ' ').Trim();
                        string[] split = logFileFullPath.Split('\\');
                        this.logFileName = split[6];

                        this.path = split[0] + "\\" + split[1] + "\\" + split[2] + "\\" + split[3] + "\\" + split[4] + "\\" + split[5];

                        //// Create a new FileSystemWatcher and set its properties.                    
                        watcher.Path = this.path + "\\";
                        watcher.Filter = this.logFileName;
                        //watch for changes to a a log file 

                        watcher.NotifyFilter = (NotifyFilters.LastWrite | NotifyFilters.Size | NotifyFilters.LastAccess | NotifyFilters.CreationTime);
                        watcher.Changed += new FileSystemEventHandler(OnChanged);
                        watcher.Created += new FileSystemEventHandler(OnChanged);



                        // Begin watching.
                        watcher.EnableRaisingEvents = true;
                    }));

                }
        }

   // Define the event handlers.
    private void OnChanged(object source, FileSystemEventArgs e)
    {
        MessageBox.Show("Im here");// not showing

        //how to copy appended lines into panel?? 
    }

OnChanged方法中的消息框不会出现。我已手动修改文件或删除它并创建它但事件未被触发。

我认为这可能与另一个进程使用的文件有关,在这种情况下是必要时更新它的exe文件。另外,我认为,如果exe在读取附加行的同时更新日志,则可能只会获得部分文本。

有没有更好的方法来监控文本文件更新并将内容复制到GUI应用程序中的面板上?

更新: 我已将代码移动到click事件或初始方法,它没有任何区别。消息框未显示

  public BatchRun()
    {
        InitializeComponent();

        watcher.Path = "C:\\Test\\Projects\\99999\\Logs";
        watcher.Filter = "*.log";
        watcher.NotifyFilter = (NotifyFilters.LastWrite | NotifyFilters.Size | NotifyFilters.LastAccess | NotifyFilters.CreationTime);
        watcher.Changed += new FileSystemEventHandler(OnChanged);
        watcher.Created += new FileSystemEventHandler(OnChanged);

        watcher.EnableRaisingEvents = true;
    }

1 个答案:

答案 0 :(得分:0)

您似乎只在StandardOutputHandler的调用中开始观看该文件。

如果仅在写入文件后调用此方法,则观察者将不会注意到文件的任何更改。

您可能希望在应用程序启动时(或至少在需要监视文件时)调用它的MethodInvoker操作中的所有代码。

然后在您的OnChanged方法中,您可能需要在UI线程上调用MessageBox.Show()