Фильтрация измененных событий FileSystemWatcher

Я пишу С# и использую FileSystemWatcher для мониторинга каталога папок (папки можно создавать и переименовывать). Я успешно обрабатываю события Created и Renamed.

Содержимое этих папок может постоянно меняться. Но ЕДИНСТВЕННОЕ изменение, о котором мне нужно знать, это когда в папку добавляется новый файл HTML.

Как отфильтровать все события изменений, кроме нового файла [HTML]?


person llg    schedule 22.11.2011    source источник


Ответы (3)


Вы можете указать подстановочный знак в конструкторе для типа файлов, которые нужно отслеживать:

var folder = @"c:\";    
FileSystemWatcher watcher = newFileSystemWatcher(folder, "*.html");

Затем, если вы хотите получать уведомления только при создании этих файлов:

watcher.Created += new FileSystemEventHandler(watcher_FileCreated);

void watcher_FileCreated(object sender, FileSystemEventArgs e)
{
// do something interesting
}
person Paul Kearney - pk    schedule 22.11.2011
comment
Спасибо за ваш ответ, однако я «наблюдаю» за каталогом, в котором можно создавать и переименовывать папки. Это содержимое папок, которое может измениться (например, добавление другого HTML-файла). Мой обработчик событий изменений улавливает КАЖДОЕ изменение, происходящее в папке. Я просто хочу поймать новый файл [html]. - person llg; 22.11.2011
comment
Вы указываете фильтр в конструкторе (*.html в моем примере выше)? Если это так, он должен срабатывать только тогда, когда происходит изменение, соответствующее подстановочному знаку. - person Paul Kearney - pk; 23.11.2011
comment
Если я использую *.html в качестве фильтра, смогу ли я перехватывать события Create и Renamed? Ниже мой код: - person llg; 23.11.2011
comment
FileSystemWatcher endoFileWatcher = new FileSystemWatcher(); endoFileWatcher.Path = listenDir; endoFileWatcher.Created += новый FileSystemEventHandler (createEventListener); endoFileWatcher.Renamed += новый RenamedEventHandler (переименованныйEventListener); endoFileWatcher.Changed += новый обработчик событий FileSystemEvent(changedEventHandler); endoFileWatcher.Фильтр = *; endoFileWatcher.EnableRaisingEvents = true; - person llg; 23.11.2011
comment
@llg: Пожалуйста, отредактируйте свой вопрос с кодом. Комментарии не место для примеров кода. - person Austin Salonen; 23.11.2011

FileSystemEventArgs содержит свойство Name, которое поможет вам фильтровать.

http://msdn.microsoft.com/en-us/library/system.io.filesystemeventargs.aspx

Быстрый пример:

static void Main(string[] args)
{
        FileSystemWatcher watcher = new FileSystemWatcher();
        watcher.Path = @"C:\";
        watcher.EnableRaisingEvents = true;
        watcher.Created += new FileSystemEventHandler((o,s) => {
        if (s.Name.ToLower().EndsWith(".html") || s.Name.ToLower().EndsWith(".htm"))
             Console.WriteLine("HTML is here");
        });

        Console.ReadLine();
 }

Обратите внимание, что вы можете передать "*.html" в конструктор, но вы не будете захватывать файлы, оканчивающиеся на файлы .htm, которые считаются допустимыми. Но я не уверен, что это соответствует вашему варианту использования.

person Bryan Crosby    schedule 22.11.2011

Просто подпишитесь на событие Change и отфильтруйте соответствующим образом с помощью существующего FSW. Если вы можете создать еще один FSW, то ответ Пола Кирни будет достаточным и, вероятно, намного чище.

string[] desiredExtensions = new [] { ".html", ... };
string desiredExtension = ".html";


watcher.Changed += watcher_Changed;

...

private void watcher_Changed(object sender, FileSystemEventArgs e)
{
   // single
   if (string.Equals(Path.GetExtension(e.FullPath), desiredExtension, StringComparison.CurrentCultureIgnoreCase))
   { ... }

   // several
   if (desiredExtensions.Any(ext => string.Equals(Path.GetExtension(e.FullPath), ext, StringComparison.CurrentCultureIgnoreCase)))
   { ... }
}
person Austin Salonen    schedule 22.11.2011
comment
Отлично, два FSW, один для события «Создано и переименовано», а другой для события изменения нового HTML-файла. СПАСИБО! - person llg; 23.11.2011