2015-12-27 74 views
0

我的程序需要監視多個位置,但爲每個位置觸發相同的代碼。由於單個FileSystemWatcher不能監視多個位置,但是是否可以創建多個實例並傳遞給每個位置的文件夾路徑?創建同一個FileSystemWatcher的多個實例

我無法對每個FileSystemWatcher進行硬編碼,因爲越來越多的位置需要及時添加,這需要由最終用戶完成,因爲我不得不手動硬編碼新的每次有FileSystemWatcher。所以我的計劃是將文件夾路徑保存到一個文件中,程序只爲列表中的每個路徑創建一個FileSystemWatcher。但我不知道這是否可能。

在這裏的工廠方法模式的建議去嘗試: 我得到的錯誤:「‘目錄’不包含‘添加’

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. 
    } 
的定義。

編輯:根據這些信息,你還設置:

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

啊我現在明白它是在更新你的代碼,但是「FileSystemWatcher」不支持「.add」,我不知道這是否意味着結束這種可能性,或者是否存在錯字/缺失系統等。 – Vereonix