2016-09-21 3 views
0

То, что я пытаюсь сделать, это посмотреть каталог для новых добавленных папок.Как правильно использовать FileSystemWatcher в C# - Несколько файлов и получение «Lazy» на мне

После добавления папки я копирую стандартную структуру каталогов из другой папки в эту, а затем использую Open Office XML для поиска и замены содержимого одного из документов Microsoft Word, который включен в исходные папки.

Все работает прекрасно ... КРОМЕ: не

1) Если я копирую более одной папки к «наблюдаемому» каталог, один из них получит обрабатывались, ни один из других будет обрабатываться. Кроме того, после этого приложение «застревает» и его нужно перезапустить, чтобы снова работать.

2) По какой-то причине он иногда получает «ленивый» на меня и просто прекращает работу. Наблюдая за консольным окном, он показывает, что он находится в части кода , но ничего не происходит. Кажется, это происходит непоследовательно.

Вот часть FileSystemWatcher кода (не хочу утомлять вас с OOXML и папки копирования битов):

class soClass 
{ 
    private const string strDirectory = @"C:\[DIRECTORY-TO-WATCH\]"; 
    private static FileSystemWatcher fw = new FileSystemWatcher(strDirectory); 
    private static void WatchIt() 
    { 
     // WHILE TRUE -- JUST MAKES IT RUN OVER AND OVER AGAIN... 
     while (true) 
     { 

      Console.WriteLine("Waiting on file/folder changes..."); 

      // HANGS HERE ON THE 'REG 
      string strName = fw.WaitForChanged(WatcherChangeTypes.Created, -1).Name; 

      Console.WriteLine("File/Folder Added!"); 

      Console.WriteLine("Starting over..."); 
      Console.WriteLine("--------------------------------------------------------"); 

     } 

    } 
} 

Как всегда, любая помощь очень ценится.

UPDATE:

Вот окончательный код, который работал, благодаря @openshac

class soClass 
{ 

    private const string strDirectory = @"C:\[DIRECTORY-TO-WATCH]"; 

    private static void Main() 
    { 
     WatchIt(); 
    } 

    public static void WatchIt() 
    { 

     FileSystemWatcher fw = new FileSystemWatcher(); 
     fw.Path = strDirectory; 
     fw.Created += new FileSystemEventHandler(OnCreated); 
     Console.WriteLine("Waiting on file/folder changes..."); 

     // BEGIN WATCHING 
     fw.EnableRaisingEvents = true; 

     // WAIT FOR USER TO QUIT THE PROGRAM 
     Console.WriteLine("Press \'q\' to quit the sample."); 
     while (Console.Read() != 'q') ; 
    } 

    private static void OnCreated(object sender, FileSystemEventArgs fileSystemEventArgs) 
    { 

     Console.WriteLine("File/Folder Added!"); 

     string strName = fileSystemEventArgs.Name; 

     // DO STUFF HERE!! 

     Console.WriteLine("Starting over..."); 
     //rwlock.ExitWriteLock(); 
     Console.WriteLine("--------------------------------------------------------"); 

    } 
} 

Также найдено помощь здесь: https://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher(v=vs.110).aspx

ответ

2

Из documenation:

Этот метод ожидает неопределенно до тех пор, пока не произойдет первое изменение, а затем возвращается .

https://msdn.microsoft.com/en-us/library/67220zhk(v=vs.110).aspx

Если вы хотите прослушать несколько событий попробуйте использовать OnCreated события:

var fw = new FileSystemWatcher(); 
    fw.EnableRaisingEvents = true; 
    fw.Created += OnCreated; 
} 

private static void OnCreated(object sender, FileSystemEventArgs fileSystemEventArgs) 
{ 
    var name = fileSystemEventArgs.Name; 
} 
+0

Это был ключ. активируя событие, а не зацикливание. этот код действительно не «дождался» события, я должен был добавить некоторые пользовательские взаимодействия для выхода. – gotmike

-1

На самом деле, это была проблема на некоторое время, когда он просто перестает работать, к сожалению. Единственные методы, которые я видел, чтобы исправить это, - это обработать его и перезапустить.

Подробнее здесь: FileSystemWatcher stops catching events

удачи. Надеюсь, однажды они это исправит.