2015-12-27 4 views
0

Моя программа должна контролировать несколько местоположений, но запускать один и тот же код для каждого местоположения. Поскольку один FileSystemWatcher не может контролировать несколько местоположений, но возможно ли создать несколько экземпляров его и передать путь к папке для каждого?Создайте несколько экземпляров того же FileSystemWatcher

Я не могу скомпоновать каждый FileSystemWatcher, так как все больше и больше местоположений необходимо будет добавить вовремя, и это должно быть сделано конечными пользователями, так как для меня крайне нецелесообразно вручную жестко кодировать новый FileSystemWatcher каждый раз. Поэтому мой план состоял в том, чтобы пути к папкам сохранялись в файле, и программа просто создает FileSystemWatcher для каждого пути в списке. Но я понятия не имею, возможно ли это в малейшей степени.

Переход на завод Method Узор предложение здесь попытка: я получаю ошибки: «Список" не содержит определения для „добавить“

public void StartWatchers() 
    { 
     string[] ArrayPaths = new string[2]; 
     List<FileSystemWatcher> watchers = new List<FileSystemWatcher>(); 
     ArrayPaths[0] = @"K:\Daily Record Checker\Test\Test1"; 
     ArrayPaths[1] = @"K:\Daily Record Checker\Test\Test2"; 

     int i = 0; 
     foreach (String String in ArrayPaths) 
     { 
      watcher.add(MyWatcherFatory(ArrayPaths[i])); 
      i++; 
     } 
     //Do other stuff.... 
     //.... 
     //Start my watchers... 
     foreach (FileSystemWatcher watcher in watchers) 
     { 
      Watcher.EnableRaisingEvents = true; 
      i++; 
     } 

    } 

    FileSystemWatcher MyWatcherFatory(string path) 
    { 
     FileSystemWatcher watcher = new FileSystemWatcher(path); 
     watcher.Changed += Watcher_Created; 
     watcher.Path = path; 
     watcher.Filter = "*.csv"; 
     return watcher; 
    } 

    private void Watcher_Created(object sender, FileSystemEventArgs e) 
    { 
     System.Threading.Thread.Sleep(1000); 
     FileInfo fileInfo = new FileInfo(e.FullPath); 
     if (!IsFileLocked(fileInfo)) 
     { 
      CheckNumberOfRecordsInFile(e.FullPath); 
     }   
    } 
+1

https://msdn.microsoft.com/en-us/library/system.object.memberwiseclone(v=vs.110).aspx –

+0

Ваш обновленный код имеет «Watcher.add» ... вы хотите добавить к ваш список: watchers.Add –

+0

Я шел по коду Owlsolo, но изменение его в список hte по-прежнему приводит к «List », не содержит определения для «add» – Vereonix

ответ

4

Используйте factory method pattern

FileSystemWatcher MyWatcherFatory(string path, object additionalParameters) 
    { 
     FileSystemWatcher watcher = new FileSystemWatcher(path); 
     watcher.Changed += myWatcherChangedMethod;//Attach them to the same listeners,,, 
     //Set additional parameters... 
     return watcher. 
    } 
.

EDIT: на основании информации, которую вы дополнительно содержит:

public void StartWatchers() 
    { 
     string[] ArrayPaths = new string[2]; 
     List<FileSystemWatcher> watchers = new List<FileSystemWatcher>(); 
     ArrayPaths[0] = @"K:\Daily Record Checker\Test\Test1"; 
     ArrayPaths[1] = @"K:\Daily Record Checker\Test\Test2"; 

     int i = 0; 
     foreach (String String in ArrayPaths) 
     { 
      watcher.add(MyWatcherFatory(ArrayPaths[i])); 
      i++; 
     } 
     //Do other stuff.... 
     //.... 
     //Start my watchers... 
     foreach (FileSystemWatcher watcherin watchers) 
     { 
      watcher.EnableRaisingEvents = true;; 
      i++; 
     } 

    } 

    FileSystemWatcher MyWatcherFatory(string path) 
    { 
     FileSystemWatcher watcher = new FileSystemWatcher(path); 
     watcher.Changed += Watcher_Created; 
     watcher.Path = path; 
     watcher.Filter = "*.csv"; 
     return watcher; 
    } 

    private void Watcher_Created(object sender, FileSystemEventArgs e) 
    { 
     System.Threading.Thread.Sleep(1000); 
     FileInfo fileInfo = new FileInfo(e.FullPath); 
     if (!IsFileLocked(fileInfo)) 
     { 
      CheckNumberOfRecordsInFile(e.FullPath); 
     }   
    } 
+0

Как запустить возвращаемый наблюдатель? Я обновил свой вопрос, чтобы показать, что я пытался реализовать, но он ничего не делает. Мне трудно разобраться с шаблоном фабричных методов в отношении моей конкретной потребности, поскольку ни один пример не запускает несколько экземпляров одного и того же класса .net. – Vereonix

+0

Я отредактировал ответ. – srandppl

+0

А я понимаю, что теперь вы обновляете свой обновленный код, однако «.add» не поддерживается для «FileSystemWatcher», я не знаю, означает ли это конец возможности, или если есть опечатка/отсутствует система и т. Д. – Vereonix