Clipper On Line • Ver Tópico - Monitorar Pasta/Arquivos - FileSystemWatcher

Monitorar Pasta/Arquivos - FileSystemWatcher

Aqui você poderá oferecer suas Contribuições, Dicas e Tutoriais (Texto ou Vídeo) que sejam de interesse de todos.

Moderador: Moderadores

 

Monitorar Pasta/Arquivos - FileSystemWatcher

Mensagempor dbsh » 29 Jul 2017 12:24

/*
- 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

010011110010000001110011011101010110001101100101011100110111001101101111001000001110100100100000011000110110111101101110011100110111010001110010011101011110110101100100011011110010000001100001001000000110111001101111011010010111010001100101
01001101011000010111001001100011011011110111001100100000010000010110111001110100011011110110111001101001011011110010000001000100011001010010000001000010011011110110111001101001
0101010001100101011011000011101000100000001010000011001000110111001010010011100100101101001110010011100000110100001100110010110100110101001100100011100100110000
Avatar de usuário

dbsh
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 115
Data de registro: 14 Jul 2004 14:19
Cidade/Estado: ES
Curtiu: 2 vezes
Mens.Curtidas: 15 vezes

Monitorar Pasta/Arquivos - FileSystemWatcher

Mensagempor lugab » 30 Jul 2017 14:14

Muito bom !!
lugab
lugab
Colaborador

Colaborador
 
Mensagens: 843
Data de registro: 19 Mai 2009 15:58
Curtiu: 126 vezes
Mens.Curtidas: 38 vezes




Retornar para Contribuições, Dicas e Tutoriais

Quem está online

Usuários vendo este fórum: Google [Bot] e 5 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro