进程在OnChanged事件中启动两次

本文关键字:两次 启动 OnChanged 事件 进程 | 更新日期: 2023-09-27 18:08:25

我已经创建了一个程序来观看使用filewatcher记事本文件。每当文件中的文本发生变化…我做了一个。exe程序来运行….exe程序也可以正常运行。但是它运行了两次……我搜索了Stackoverflow和其他网站。但我不明白我哪里错了…朋友们,请帮助我澄清我的错误…我知道这个问题已经被问过很多次了。但是因为我是c#新手,所以我无法理解…朋友们,请帮帮我。

    public Form1()
    {
        InitializeComponent();
    }
    private void filewatcher()
    {
        path = txtBoxPath.Text;
        FileSystemWatcher fileSystemWatcher1 = new FileSystemWatcher();
        fileSystemWatcher1.Path = path;
        fileSystemWatcher1.Filter = "*.txt";
        fileSystemWatcher1.NotifyFilter = NotifyFilters.LastWrite;
        fileSystemWatcher1.Changed += new FileSystemEventHandler(OnChanged);
        fileSystemWatcher1.EnableRaisingEvents = true;
    }
    private void tbtextcopy()
    {
        Clipboard.SetText(File.ReadAllText(path));
        this.textBox1.Text = Clipboard.GetText().ToString();
    }
    private void OnChanged(object sender, FileSystemEventArgs e)
    {
        try
        {
            ProcessStartInfo PSI = new ProcessStartInfo(@"C:'Program Files'Ranjhasoft'Icon Changer'Icon changer.exe");
            Process P = Process.Start(PSI);
            P.WaitForExit();
            P.Close();
        }
        finally
        {
            fileSystemWatcher1.EnableRaisingEvents = false;
        }
    }
    private void BrowserBtn_Click(object sender, EventArgs e)
    {
        FolderBrowserDialog dlg = new FolderBrowserDialog();
        dlg.SelectedPath = this.txtBoxPath.Text;
        DialogResult result = dlg.ShowDialog();
        if (result == DialogResult.OK)
        {
            if (!string.IsNullOrEmpty(dlg.SelectedPath))
            {
                this.txtBoxPath.Text = dlg.SelectedPath;
            }
        }
        if (string.IsNullOrEmpty(this.txtBoxPath.Text))
        {
            this.txtBoxPath.Text = appDataFolder;
        }
        if (!Directory.Exists(path))
        {
            MessageBox.Show("Specified folder does not exist");
        }
    }
    private void txtBoxPath_TextChanged(object sender, EventArgs e)
    {
        if (!string.IsNullOrEmpty(this.txtBoxPath.Text))
        {
            this.filewatcher();
        }
    }
}

}

进程在OnChanged事件中启动两次

代码

fileSystemWatcher1.Changed += new FileSystemEventHandler(OnChanged);

可以重复地向事件中添加相同的事件处理程序。所以,是的,它可以做20次…

你只需要设置它来运行一次代码,所以只添加它一次。如果你停止触发事件,事件处理程序不会擦除。因此,只设置一次事件处理程序,而不是每次都在filewatcher方法中设置,否则会重复添加相同的处理程序并产生多个响应。

所以在这里修改代码:

public Form1()
{
    InitializeComponent();
    fileSystemWatcher1.Changed += new FileSystemEventHandler(OnChanged);
}

并将其从filewatcher方法中删除。现在,当raiseevents被设置为true时,它将运行一次,而当它不是true时,它根本不会运行。