- As principais propriedades do FileSystemWatcher são:
- EnableRaisingEvents ? o diretório só será monitorado se esta propriedade estiver ?setada? como true.
- Path ? será a pasta que será monitorada pelo nosso componente.
- IncludeSubDirectories ? valor booleano, se deixarmos true, ele irá monitorar os subdiretórios.
- Filter ? é a extensão do arquivo que nosso componente irá filtrar (.txt por exemplo). Se deixarmos o valor padrão (*.*), ele irá filtrar todos os arquivos.
- NotifyFilter ? serão os atributos (ou gatilhos) que, ao serem alterados, farão com que nosso componente dispare um determinado evento que irá notificar o usuário que determinado arquivo ou diretório foi alterado.
- Atributos para os Filtros de Notificação (NotifyFilter):
- Attributes ? o atributo do arquivo ou diretório.
- CreationTime ? a hora que o arquivo ou diretório foi criado.
- DirectoryName ? o nome do diretório.
- FileName ? o nome do arquivo.
- LastAccess ? a data da última abertura do arquivo ou diretório.
- LastWrite ? a data da última escrita no arquivo ou diretório.
- Security ? as configurações de segurança do arquivo ou diretório.
- Size ? O tamanho do arquivo ou diretório
*/
FUNCTION MonitorarArquivo(sDrive, sPath, lSubDir, sNotify, sFiltro, sExe, sSegundos)
LOCAL sQuery, objWMIService, ColEvents
LOCAL objEvent, objTargetInst, objPrevInst, objProperty, lRen, aRen
DEFA sDrive TO DiskName() + ":"
DEFA sPath TO DirName()
DEFA sSegundos TO "2"
//sNotify := 'FileName'
//sFiltro := '*.exe'
sPath := StrTran(sPath, "\", "\\")
sPath := StrTran(sPath, "\\\", "\\")
aRen := { "CAPTION", "DESCRIPTION", "EIGHTDOTTHREEFILENAME", "FILENAME", "NAME" }
lRen := .F.
objWMIService := WMI_Connect()
//monitorar programa notepad.exe
//sQuery := "Select * From __InstanceOperationEvent Within 2 Where TargetInstance Isa 'Win32_Process' And Upper(TargetInstance.Name) = 'NOTEPAD.EXE'"
//monitora so arquivos criados, pelo notepad.exe
//sQuery := "Select * From InstanceCreationEvent Within 2 Where TargetInstance Isa 'Win32_Process' And Upper(TargetInstance.Name) = 'NOTEPAD.EXE'"
//monitora so arquivos deletados, pelo notepad.exe
//sQuery := "Select * From InstanceDeletionEvent Within 2 Where TargetInstance Isa 'Win32_Process' And Upper(TargetInstance.Name) = 'NOTEPAD.EXE'"
//monitora so arquivos alterados, pelo notepad.exe
//sQuery := "Select * From InstanceModificationEvent Within 2 Where TargetInstance Isa 'Win32_Process' And Upper(TargetInstance.Name) = 'NOTEPAD.EXE'"
sQuery := "Select * From __InstanceOperationEvent" ;
+ " Within " + sSegundos ;
+ " Where Targetinstance Isa 'CIM_DataFile'" ;
+ " And TargetInstance.Drive='" + sDrive + "'" ;
+ " And TargetInstance.Path='" + sPath + "'"
IF !Empty(sNotify)
sQuery += " And TargetInstance.NotifyFilter='" + sNotify + "'"
ENDIF
IF !Empty(sFiltro)
sQuery += " And TargetInstance.Filter='" + sFiltro + "'"
ENDIF
IF !Empty(lSubDir)
sQuery += " And TargetInstance.IncludeSubdirectories=True"
ENDIF
IF !Empty(sExe)
sQuery += " And Upper(TargetInstance.Name)='" + sExe + "'"
ENDIF
//Executa query
ColEvents := objWMIService:ExecNotificationQuery (sQuery)
//ColEvents:EnableRaisingEvents := .T.
//ColEvents: := .T.
Inkey()
WHILE Inkey() <> K_ESC
objEvent := colEvents:NextEvent() //SWbemEventSource
objTargetInst := objEvent:TargetInstance() //SWbemObject
DO CASE
CASE objEvent:Path_:Class = "__InstanceModificationEvent"
objPrevInst := objEvent:PreviousInstance()
FOR EACH objProperty In objTargetInst:Properties_
IF objProperty:Value <> objPrevInst:Properties_(objProperty:Name):Value
//? "Alterado: " + objTargetInst:Name
//? "Propriedade: " + objProperty:Name
//? "Valor Anterior: " + objPrevInst:Properties_(objProperty:Name):Value
//? "Valor Atual: " + objProperty:Value
//?
ENDIF
NEXT
objPrevInst := NIL
CASE objEvent:Path_:Class = "__InstanceCreationEvent"
IF objPrevInst <> NIL
lRen := .T.
For Each objProperty In objTargetInst:Properties_
If objProperty:Value <> objPrevInst:Properties_(objProperty:Name):Value
IF AScan(aRen, Upper(objProperty:Name)) = 0
lRen := .F.
EXIT
ENDIF
End If
Next
ENDIF
//nao achei opcao para controlar arquivo renomeado.
//ao renomear arquivo lanca dois eventos, 1 de exclusão outro de criação
//criei este artificio.
//Falha - se mover para outra pasta e retornar sem outra alteração antes, considera que foi renomeado o arquivo
IF lRen
//? "Renomeado: " + objPrevInst:Name + " - " + objTargetInst:Name
objPrevInst := NIL
lRen := .F.
ELSE
//? "Criado: " + objTargetInst:Name
ENDIF
CASE objEvent:Path_:Class = "__InstanceDeletionEvent"
//? "Deletado: " + objTargetInst:Name
objPrevInst := objTargetInst //salva para verificar se foi renomeado o arquivo
ENDCASE
ENDDO
RETURN .T.
FUNCTION WMI_Connect(oWMI)
LOCAL oSrv, oErr
BEGIN SEQUENCE WITH {| e | Break( e ) }
DEFA oWMI TO WMI_Object()
oSrv := oWMI:ConnectServer()
RECOVER USING oErr
oSrv := NIL
END SEQUENCE
RETURN oSrv
FUNCTION WMI_Object()
LOCAL oWMI, oErr
BEGIN SEQUENCE WITH {| e | Break( e ) }
oWMI := OleCria( "wbemScripting.SwbemLocator" )
RECOVER USING oErr
oWMI := NIL
END
RETURN oWMI