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           
    }
}

ファイルが変更されるたびに、メッセージボックスが一度表示されるはずです。問題は、1 つのメッセージ ボックスを取得する代わりに、5 ~ 6 個のメッセージ ボックスがポップアップ表示されることです。これを修正する方法がわかりません。良い解決策があることを願っています。:)

ありがとう!

// モーガン

4

6 に答える 6

2

これは仕様によるもので、イベント ハンドラーは通知ごとに異なるスレッドで呼び出されます。簡単な修正は、FileSystemWatcher.SynchronizingObject プロパティを設定することです。

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

しかし、それは本当に良い考えではありません。FSW はブロックされ、[OK] ボタンをクリックするのを待っているため、通知を見逃す可能性があります。通知イベントにメッセージ ボックスを表示することは、良い考えではありません。できるだけ早く通知を処理する必要があります。

于 2010-03-01T22:40:41.070 に答える
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 に答える
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 に答える
0

私がお勧めするのは、MessageBox を表示する前に、たとえば 10 ~ 100 ミリ秒の短い遅延を設けることです。そうすれば、ファイルが非常に迅速に数回変更されたときに、MessageBox が 1 つだけ取得されます。

つまり、通知が来たらタイマーを開始します。タイマーがすでに開始されている場合は、通知を無視してください。タイマーがトリガーされたら、タイマーを停止して MessageBox を表示します。

于 2010-03-01T22:43:29.550 に答える
0

これを修正する最も簡単な方法は、次のようにプライベート bool を宣言することです。

private bool m_IsBoxShown;

コンストラクターで、値を false に設定します。
上記のコードを次のように変更します
。if (MessageBox.Show("Vill du ladda upp filen " + e.Name + "?", "En fil har ändrats", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
{
m_IsBoxShown=false; //コード コード コード
} else { m_IsBoxShown=false; } } }

于 2010-03-01T22:42:30.187 に答える