2016-03-26 9 views
0

Ich verwende FileSystemWatcher, um mehrere Ordner auf einem Netzwerkspeicher zu überwachen. Das Problem ist, dass ich die Anzahl der Änderungen für jeden Standort zählen muss. Der Zähler wird nicht korrekt erhöht, weil, wenn die Datei von der zweiten Stelle geändert wird der Zähler bereits bis 2.Wie kann die Anzahl der Änderungen an mehreren Standorten gezählt werden?

Ich habe den folgenden Code festgelegt ist:

private void button1_Click(object sender, EventArgs e) 
{ 
    FileMonitor(Directory.GetCurrentDirectory()); 
    FileMonitor(@"C:\Users\NET\Desktop"); 
} 

static int _counter = 1; 
public static int Counter 
{ 
    get { return _counter; } 
    set { _counter = value; } 
} 

private void FileMonitor(string path) 
{ 
    FileSystemWatcher watcher = new FileSystemWatcher(); 
    watcher.Path = path; 
    watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite 
    | NotifyFilters.FileName | NotifyFilters.DirectoryName; 
    watcher.Filter = "*.csv"; 
    watcher.Changed += (s, e) => OnChanged(e.FullPath, watcher); 

    watcher.EnableRaisingEvents = true; 
} 

private static void OnChanged(string path, FileSystemWatcher watcher) 
{ 
    try 
    { 
     watcher.EnableRaisingEvents = false; 
     MessageBox.Show(Counter.ToString()); 
     Counter = Counter + 1; 
    } 
    finally 
    { 
     watcher.EnableRaisingEvents = true; 
    } 
} 

Wie kann ich den Zähler gesetzt eindeutig zu sein für jede FileMonitor-Instanz?

Antwort

1

Das Problem ist, dass Sie Ihre Zähler statisch machen, so dass dieser Zähler für alle Monitore geteilt wird. Es gibt einige Möglichkeiten, die Ihnen helfen können:

  1. Sie können Ihren Zähler für eine Zählerliste ändern. Dann verwendet Ihr erster Monitor Zähler [0] und so weiter.
  2. Sie können eine Klasse mit zwei Eigenschaften erstellen, dem Monitor und dem Zähler, und jedes Mal, wenn Sie OnChanged eingeben, können Sie den Zähler dieses Monitors erhöhen.

Ich hoffe, das kann Ihnen helfen.

Edit:
MainWindow.xaml.xs

List<FileMonitor> monitors = new List<FileMonitor>(); 

     public MainWindow() 
     { 
      InitializeComponent(); 
     } 
     private void Button_Click(object sender, RoutedEventArgs e) 
     { 
      monitors.Add(new FileMonitor(@"C:")); 
      monitors.Add(new FileMonitor(@"D:")); 
     } 

FileMonitor.cs

public class FileMonitor 
    { 
     public int Counter { get; set; } 
     public FileSystemWatcher Watcher { get; set; } 
     public FileMonitor(string path) 
     { 
      Counter = 0; 
      Watcher = new FileSystemWatcher(); 
      Watcher.Path = path; 
      Watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite 
      | NotifyFilters.FileName | NotifyFilters.DirectoryName; 
      Watcher.Filter = "*.csv"; 
      Watcher.Changed += (s, e) => OnChanged(); 

      Watcher.EnableRaisingEvents = true; 
     } 

     private void OnChanged() 
     { 
      try 
      { 
       Watcher.EnableRaisingEvents = false; 
       MessageBox.Show(Counter.ToString()); 
       Counter = Counter + 1; 
      } 
      finally 
      { 
       Watcher.EnableRaisingEvents = true; 
      } 
     } 
    } 
+0

Können Sie mir einen Link oder eine Probe von Code für die zweite Lösung? Ich verstehe nicht, wie ich den Zähler eines bestimmten Monitors erhöhen kann. – sarbo

+0

@sarbo sehen meine bearbeiten – ganchito55

+1

danke für dieses Beispiel. Ich habe einige Änderungen vorgenommen und jetzt funktioniert es wie es sollte. – sarbo

Verwandte Themen