1

您好,我又遇到了一个我自己无法解决的问题。

我有一个FileSystemWatcher命名filOvervakare并使用此代码来触发一个方法。

filOvervakare.NotifyFilter = NotifyFilters.Size;
filOvervakare.NotifyFilter = NotifyFilters.LastWrite;

filOvervakare.Changed += new FileSystemEventHandler(filOvervakare_Changed);

这是方法:

void filOvervakare_Changed(object sender, FileSystemEventArgs e)
{
    if (MessageBox.Show("Vill du ladda upp filen " + e.Name + "?", "En fil har ändrats", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
    {
        //code code code           
    }
}

每次更改文件时,都应该显示一次消息框。问题是它没有得到一个消息框,而是弹出了 5-6 个消息框,我不知道如何解决这个问题,我希望你们中的一些人可能有一个好的解决方案。:)

谢谢!

// 摩根

4

6 回答 6

2

这是设计使然,事件处理程序在每个通知的不同线程上调用。一个快速修复方法是设置 FileSystemWatcher.SynchronizingObject 属性:

    public Form1() {
        InitializeComponent();
        fileSystemWatcher1.SynchronizingObject = this;
    }

但这不是一个好主意,FSW 很容易因为被阻止而错过通知,等待您单击 OK 按钮。在通知事件中显示消息框并不是一个好主意,您希望尽快处理通知。

于 2010-03-01T22:40:41.070 回答
1

您可以使用布尔值来告诉您是否打开了消息框。

private bool messageBoxIsOpen;

void filOvervakare_Changed(object sender, FileSystemEventArgs e)
{
    if (this.messageBoxIsOpen)
    {
        return;
    }

    this.messageBoxIsOpen = true;
    if (MessageBox.Show(
        "Vill du ladda upp filen " + e.Name + "?", 
        "En fil har ändrats", 
        MessageBoxButtons.YesNo, 
        MessageBoxIcon.Question) == DialogResult.Yes)
    {
       //code code code           
    }

    this.messageBoxIsOpen = false;
}
于 2010-03-01T22:40:10.763 回答
1

文件系统观察程序会触发一些事件,例如 LastAccess、LastWrite 等。您可以在显示消息框或设置 NotifyFilter 属性之前检查事件参数以了解触发事件的原因。

于 2010-03-01T22:43:02.957 回答
1

您可以将上次更改的文件名保存在一个虚拟变量中,并且在引发更改的事件时,除非文件名与保存的变量不同,否则不要显示消息框。

string lastChangedFileName = "";
void filOvervakare_Changed(object sender, FileSystemEventArgs e)
    {

if(lastChangedFileName != e.Name)
{
        if (MessageBox.Show("Vill du ladda upp filen " + e.Name + "?", "En fil har ändrats", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
        {
           //code code code           
        }
}
lastChangedFileName = e.Name;

    }
于 2010-03-01T22:44:39.140 回答
0

解决此问题的最简单方法是声明一个私有布尔值,如下所示:

private bool m_IsBoxShown;

在您的构造函数中,将该值设置为 false。将上面的代码更改为如下所示: void filOvervakare_Changed(object sender, FileSystemEventArgs e)
{
if (m_IsBoxShown == false) { m_IsBoxShown=true; if (MessageBox.Show("Vill du ladda upp filen" + e.Name + "?", "En fil harändrats", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
{
m_IsBoxShown=false; //code code code
} else { m_IsBoxShown=false; } } }

于 2010-03-01T22:42:30.187 回答
0

我建议在显示 MessageBox 之前有一个短暂的延迟,比如 10-100 毫秒。这样,当文件快速更改几次时,您只会得到一个 MessageBox。

换句话说,当通知进来时,启动计时器。如果计时器已经启动,则忽略通知。当计时器触发时,停止计时器并显示 MessageBox。

于 2010-03-01T22:43:29.550 回答