在FileSystemWatcher检测到更改后读取文本文件的最后一行

时间:2013-03-06 12:47:48

标签: c# filesystemwatcher

我是c#的新手所以请原谅我的无知,我正在文本文件上运行fileSystemWatcher。它工作正常,我可以在文件更改后执行一些简单的任务。除了我想做的一切。 我正在尝试阅读使用此代码更改的文本文件的最后一行

public void File_Changed( object source, FileSystemEventArgs e )
{
    string MACH1 = File.ReadText(@"C:\MACHINE_1.txt").Last();
    if (MACH1=="SETUP")
    {
        MACHINE1IND.BackColor = Color.Green; 
    }
    else
    {
        MACHINE1IND.BackColor = Color.Red; 
    }
}

它在按钮内工作正常但在文件观察者之后没有。 说它找不到文件?

3 个答案:

答案 0 :(得分:0)

需要注意的一点是,FSW可以在保存操作期间发出多个更改通知。您无法知道保存何时完成。因此,您需要始终将代码包装在try..catch块中,并在超时后支持重试以允许完成文件写入。通常,我会尝试将文件移动到临时位置,我将进行处理。如果移动失败,请等待几秒钟再试一次。

答案 1 :(得分:0)

在访问文件之前,您必须检查文件是否存在。

public void File_Changed(object source, FileSystemEventArgs e)
{
    string filePath = @"C:\MACHINE_1.txt";
    if(!File.Exists(filePath)) //Checks if file exists
        return;
    string MACH1 = File.ReadText(filePath).Last();
    if (MACH1=="SETUP")
    {
        MACHINE1IND.BackColor = Color.Green; 
    }
    else
    {
        MACHINE1IND.BackColor = Color.Red; 
    }
}

答案 2 :(得分:0)

正如Jim Wooley在他的回答中解释的那样,当FSW发起CreatedChanged事件时,文件操作可能仍在进行中。如果FSW用于在两个应用程序之间进行通信,并且您可以控制"发送"应用程序也可以解决问题如下:

将信息写入临时文件。关闭文件。重命名临时文件并为其指定一个名称。

在其他应用程序(接收方)中使用Renamed监视FileSystemWatcher事件。重命名的文件保证完整。