2016-06-29 20 views
0

Ich habe ein Verzeichnis und ein FileSystemWatcher und ich möchte die Anzahl der Balloon.Show jedes Mal reduzieren, wenn ich eine Datei lösche, aber wie kann ich tun? Denn jedes Mal, wenn ich 20 Dateien lösche explorer.exe stürzt wegen der ShowBalloonTips. Es gibt eine Lösung, die ich in diesem Forum gefunden habe, die funktioniert, wenn ich die Dateien eins nach dem anderen lösche, aber wenn ich sie alle lösche, wird es abgehört und feuert OnDelete nicht mehr ... Irgendwelche Vorschläge?So reduzieren Sie die Anzahl der Ballons

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(); 
    } 

Antwort

0

Es ist nicht der effizienteste Weg, aber ich würde wahrscheinlich die Anzahl der Dateien gelöscht und zeigen den Tooltip jedes x-ten Mal, wie

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

Auch wenn ich nicht verstehe, wie das funktionieren kann, funktioniert das tatsächlich! Danke, mein Freund! P.S: Nop, mein Schlechter, das funktioniert gar nicht – JoeSpastico

+0

Wenn das dein Problem behebt, bitte als Antwort markieren. Danke. –

+0

Nun, tut mir Leid: < – JoeSpastico

0

Sie besser noch ein bisschen warten halten, bevor Sie die Meldung anzeigen und verhindern, dass viele Benachrichtigungen an den Explorer gesendet werden.

Der beste Weg, dies zu tun ist, indem Sie den Timer verwenden, um die Benachrichtigung um 500 ms zu verzögern. Während dieser Zeit verfolgen Sie, wie viele Dateien in einem einfachen Zähler gelöscht wurden. Sobald der Timer aktiviert ist, zeigen Sie die Benachrichtigung mit der Anzahl der bisher gelöschten Dateien an. Sie setzen den Zähler zurück und warten ein wenig, bis die Benachrichtigung verschwindet. Dann sind Sie wieder im Ausgangszustand und der Prozess kann neu gestartet werden.

Eine Implementierung von oben beschriebenen Szenario könnte wie folgt aussehen:

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

Ich konnte keinen zuverlässigen Weg finden, um festzustellen, ob die Benachrichtigung bereits gegangen ist, daher die zusätzlichen Wartezustände, bevor ich auf die Anfänge zurückgesetzt Zustand. Wenn Ihre Benutzer sich wirklich um die genaue Anzahl gelöschter Dateien kümmern, sollten Sie die Anzahl der gelöschten gelöschten Dateien straffen. Ich überlasse das als Übung.

+0

Vielen Dank, Mann, aber ich habe gestern schon eine schnellere Lösung gefunden, aber auch Ihr Weg ist gut! – JoeSpastico

Verwandte Themen