Página 1 de 1

Monitorar Pasta/Arquivos - FileSystemWatcher

Enviado: 29 Jul 2017 12:24
por dbsh
/*
- 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
*/

Código: Selecionar todos

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



Monitorar Pasta/Arquivos - FileSystemWatcher

Enviado: 30 Jul 2017 14:14
por lugab
Muito bom !!