2013-08-06 5 views
2

Я пытаюсь разработать доказательство концепции веб-службы WCF, которая использует класс FileSystemWatcher для прослушивания каталога и просто выводит тип изменения и полный путь к файлам, которые изменены ,Служба WCF для мониторинга каталога изменений файла

У меня есть пример консольного приложения, которое работает так, как ожидалось, но когда я переношу это в библиотеку WCF, обработчик событий для изменений файла никогда не срабатывает.

Код:

public void MonitorFolder() 
    { 
     System.IO.FileSystemWatcher watcher = new System.IO.FileSystemWatcher(); 
     watcher.Path = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "folder-to-watch"); 
     watcher.IncludeSubdirectories = false; 
     watcher.Changed += watcher_Changed; 
     watcher.Filter = "*.*"; 
     watcher.NotifyFilter = NotifyFilters.LastAccess | 
        NotifyFilters.LastWrite | 
        NotifyFilters.FileName | 
        NotifyFilters.DirectoryName; 
     watcher.EnableRaisingEvents = true; 
    } 

    void watcher_Changed(object sender, System.IO.FileSystemEventArgs e) 
    { 
     Console.WriteLine(string.Format("Change: {0}, File: {1}", e.ChangeType, e.FullPath)); 
    } 

И внутри класса клиента, который вызывает службу:

static void Main(string[] args) 
    { 
     FileListenerClient c = new FileListenerClient(); 
     c.MonitorFolder(); 
     c.Close(); 
    } 

Любые идеи, почему это не улавливают изменения файла?

ответ

1

Возможно, вы неправильно поняли цель службы WCF по сравнению с обычной службой Windows. Служба WCF по умолчанию активируется только по вызову. Это не то, что работает постоянно в фоновом режиме, как обычная служба Windows.

Для вашего точного примера вам, вероятно, потребуется какое-то ожидание перед закрытием, и вам нужен ваш наблюдатель как локальная переменная в вашей функции, но переменная класса для ее работы.

+0

Спасибо за ваш ответ - услуга теперь работает без каких-либо изменений. Не уверен, что исправлено, но внесение изменений уловлено обработчиком событий. – andrewb

2

Environment.SpecialFolder.Desktop означает рабочий стол текущего пользователя.

Если ваш сервис работает под учетной записью LocalSystem (или аналогичной), он отслеживает свой рабочий стол, а не рабочий стол текущего интерактивного пользователя, в котором вы меняете файлы или папки.

Конечно, рабочий стол службы учетной записи остается неизменным, поэтому событие не срабатывает.

+0

Учетная запись службы и учетная запись, выполняющая клиент, одинаковы. – andrewb

0

Предполагая: а) поведение, которое вы подробно описали, является тем, что вы хотите, и б) вы смотрите правильную папку, посмотрели ли вы на довольно известные проблемы с помощью InternalBufferSize и FileSystemWatcher?

Есть прочитанный из этого http://social.msdn.microsoft.com/Forums/vstudio/en-US/4465cafb-f4ed-434f-89d8-c85ced6ffaa8/filesystemwatcher-reliability

Смежные вопросы