Как я могу поднять событие вручную для FileSystemWatcher

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

Однако моя проблема заключается в том, что когда мой FileSystemWatcher впервые инициализируется, он автоматически проверяет содержимое папки в указанной папке, чтобы получить количество файлов. Если предел уже достигнут, мне нужно немедленно вызвать событие, а не ждать, пока FileSystemWatcher сообщит об этом.

В настоящее время я могу вызывать события только путем подключения к вызовам .Created и .Deleted, однако, поскольку никакие файлы не создаются и не удаляются, я не знаю, как вызвать событие вручную.

Public Sub Initialize()
        SetFolderCountStatus() 'Set the isFolderEmpty flag based on file contents
        If Not isFolderEmpty Then
            If options.WatchForFolderCount Then 
                If FileCountReached(options.FileCountToWatch) Then
                    RaiseEvent EventFolderCount(sender, e) 'Sender and e are never defined
                End If
            End If
        End If
    End Sub

Моя проблема в том, что и sender, и e никогда ничем не заполняются, потому что они находятся за пределами моего WatcherEventArgs.

Я уверен, что это можно сделать лучше, но я не уверен. Любая помощь будет оценена по достоинству. Спасибо


person Riples    schedule 30.07.2015    source источник
comment
RaiseEvent EventFolderCount(Nothing, New WatcherEventArgs(...) ) будет работать, но было бы лучше просто вызвать метод, который выполняет необходимую вам работу, которая также вызывается реальными событиями.   -  person Ňɏssa Pøngjǣrdenlarp    schedule 30.07.2015


Ответы (2)


Вы действительно используете sender и EventArgs в своем методе EventFolderCount? Вы можете передать Me для отправителя и пустой объект EventArgs.

Однако Каковы аргументы события "sender" и "e" предполагает, что попытка вызвать событие не является предпочтительной. Вместо этого у вас должен быть один метод, который выполняет задачу и вызывается в обоих местах.

person Dave Anderson    schedule 30.07.2015
comment
Спасибо, Дэйв. На самом деле я использую EventArgs для ссылки на .FullPath файла(ов). - person Riples; 30.07.2015
comment
@Riples, можете ли вы создать EventArgs с правильно установленным .FullPath? Вы придерживаетесь создания события или абстрагируете логику в специальный метод, который можно вызывать из обоих мест? - person Dave Anderson; 30.07.2015

На самом деле я решил это, изменив свой EventHandler так, чтобы он требовал только переменную String, а не EventArgs:

Public Event EventFolderCount(filename As String)

Таким образом, я мог бы легко вызвать его внутри и снаружи FileSystemWatcher вот так:

RaiseEvent EventFolderCount(filename)

Спасибо @Dave Anderson за то, что указал мне правильное направление.

person Riples    schedule 03.08.2015