如何计算多个位置的更改次数?

时间:2016-03-26 16:06:14

标签: c# filesystemwatcher

我使用FileSystemWatcher监控网络存储上的多个文件夹。 问题是我必须计算每个位置的更改数量。计数器未正确递增,因为当第二个位置的文件发生更改时,计数器已设置为2。

我有以下代码:

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

如何将计数器设置为每个FileMonitor实例的唯一值?

1 个答案:

答案 0 :(得分:1)

问题在于您将计数器设为静态,因此所有显示器都会共享此计数器。有一些方法可以帮助您:

  1. 您可以更改计数器,以获取计数器列表。然后你的第一台显示器使用计数器[0],依此类推。
  2. 您可以创建一个包含两个属性的类,即监视器和计数器,每次在OnChanged中输入时,都可以增加此监视器的计数器。
  3. 我希望这可以帮到你。

    编辑:
    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;
                }
            }
        }