2016-06-29 5 views
0

私はディレクトリとFileSystemWatcherを持っていますが、ファイルを削除するたびにBalloon.Showの数を減らしたいのですが、どのようにすればいいですか? 20のファイルのように削除するたびに、explorer.exeはあまりにも多くのShowBalloonTipsの原因をクラッシュさせるためです。 このフォーラムで見つけた解決策は、ファイルを1つずつ削除すると機能しますが、それらをすべて削除すると、盗聴され、OnDeleteはこれ以上消えません。バルーンの数を減らす方法

private void InitializeWatcher() 
{ 
    watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite 
          | NotifyFilters.FileName | NotifyFilters.DirectoryName; 
    watcher.Filter = "*.*"; 
    watcher.Changed += new FileSystemEventHandler(OnChanged); 
    watcher.Created += new FileSystemEventHandler(OnCreated); 
    watcher.Deleted += new FileSystemEventHandler(OnDeleted); 
    watcher.Renamed += new RenamedEventHandler(OnRenamed); 
    watcher.EnableRaisingEvents = true; 
} 

private void OnDeleted(object sender, FileSystemEventArgs e) 
{ 
    SetBalloonTip("File Eliminato"); 
    notifyIcon1.ShowBalloonTip(1); 

    ((FileSystemWatcher)sender).Deleted -= new FileSystemEventHandler(OnDeleted); 
    timerRepeat.Interval = 500; 
    timerRepeat.Elapsed += new ElapsedEventHandler(t_Elapsed); 
    timerRepeat.Start(); 
    } 

    void t_Elapsed(object sender, ElapsedEventArgs e) 
    { 
     ((System.Timers.Timer)sender).Stop(); 
    } 

答えて

0

これは、最も効率的な方法ではないのですが、私はおそらくあなたが通知を表示する前に、あなたがより良いビットを待つ

private int deleteCounter = 0; 

private void OnDeleted(object sender, FileSystemEventArgs e) 
{ 
    //your delete code 
    if(deleteCounter % 50 == 0) 
    { 
     SetBalloonTip("File Eliminato"); 
     notifyIcon1.ShowBalloonTip(1); 
    } 
} 
+0

これがどのように機能するのかわからなくても、これは実際に動作します!バディーありがとう! P.S:ノップ、悪い、これはまったくうまくいきません – JoeSpastico

+0

これで問題が解決した場合は、答えとしてマークしてください。ありがとうございました。 –

+0

まあ、申し訳ありません:< – JoeSpastico

0

のように、削除されたファイルの数を保持し、ツールチップごとのn番目の時間を表示しますエクスプローラで多くの通知をプッシュすることを防ぎます。

これを行う最善の方法は、タイマーを使用して通知を500ミリ秒遅延させることです。その間、単純なカウンターで削除されたファイルの数を追跡します。タイマーが立ち上がると、これまでに削除されたファイル数で通知が表示されます。カウンタをリセットして、通知が消えるのを少し待ってください。その後、初期状態に戻り、プロセスを再開できます。

上記のシナリオの実装は次のようになります。

int pendingDeletes = 0; 
int TipState = 0; // keeps the state of the notifyIcon, 
        // 0 = initial, 
        // 1 is about to be shown 
        // above 1 is waiting to reset to 0 

private void OnDeleted(object sender, FileSystemEventArgs e) 
{ 
    pendingDeletes++; 
    if (TipState == 0) 
    { 
     TipState++; 
     // it didn't want to start http://stackoverflow.com/a/18348878 
     this.Invoke(new MethodInvoker(() => timer1.Start())); 
    } 

} 

// tick every 500 ms 
private void timer1_Tick(object sender, EventArgs e) 
{ 
    Trace.WriteLine(TipState); 
    switch(TipState) 
    { 
     case 1: 
      notifyIcon1.BalloonTipText = String.Format("{0} deleted file(s)", pendingDeletes); 
      notifyIcon1.ShowBalloonTip(500); 
      pendingDeletes = 0; 
      TipState++; 
      break; 
     case 2: 
      // do nothing 
      TipState++; 
      break; 
     case 3: 
      // maybe do something if pendingDeletes > 0 
      timer1.Stop(); 
      // back to initial state 
      TipState = 0; 
      break; 
     default: 
      // prevent mishaps 
      TipState = 0; 
      break; 
    } 
} 

を、私は戻って初期にリセットする前に、私は余分な待機状態、したがって、通知が既になくなっているかどうかを検出する信頼性の高い方法を見つけることができませんでした状態。ユーザーが実際に削除されたファイルの正確な数を気にしている場合、報告された削除済みファイルの数を適切に管理したい場合があります。私はエクササイズとしてそれを残す。

+0

ありがとう、あまりにも多くの男が、私はすでに昨日より速いソリューションを見つけただけでなく、あなたの方法は良いです! – JoeSpastico

関連する問題