如果可能的话,我会得到一些帮助或指导。
我正在尝试实时监控文本文件,并将附加的文本复制到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;
}
答案 0 :(得分:0)
您似乎只在StandardOutputHandler
的调用中开始观看该文件。
如果仅在写入文件后调用此方法,则观察者将不会注意到文件的任何更改。
您可能希望在应用程序启动时(或至少在需要监视文件时)调用它的MethodInvoker
操作中的所有代码。
然后在您的OnChanged
方法中,您可能需要在UI线程上调用MessageBox.Show()
。