none
FileSystemWatcher RRS feed

  • Pergunta

  • Galera estou usando o FileSystemWatcher para visualização de arquivos em determinado diretorio, porém consigo visualizar quem deleta / renomeia / cria arquivos ou pastas no determinado diretorio, gostaria de saber sobre EXECUÇÃO de algum arquivo dentro do diretorio, será possivel?

    Valeu galera!!!

    Linguagem C# - VS 2008 - FW 3.5

    Abraços!


    Edgar Esteves - www.localdosuporte.com.br
    sábado, 18 de abril de 2009 19:19

Respostas

  • Olá Edgar,

    Realmente com a classe FileSystemWatcher só é possivel fazer o que voce citou (alem de alteracoes nos arquivos tbem).

    Talvez voce consiga fazer isso utilizando a classe ManagementEventWatcher .
    Apenas para te dar uma ideia, o exemplo abaixo aguarda a execucao de um programa e registra esse operacao no log do Windows:

    // consulta WMI a ser executada
    WqlEventQuery DemoQuery = new WqlEventQuery("__InstanceCreationEvent", new TimeSpan(0, 0, 1), "TargetInstance isa \"Win32_Process\"");
                            
    // instancia watcher 
    ManagementEventWatcher DemoWatcher = new ManagementEventWatcher();
    DemoWatcher.Query = DemoQuery;
    DemoWatcher.Options.Timeout = new TimeSpan(0, 0, 30);
    
    Console.WriteLine("Open an application to trigger an event");
    
    // aguarda execucao de algum programa
    ManagementBaseObject e = DemoWatcher.WaitForNextEvent();
    
    // nome do programa que foi executado
    string EventName = ((ManagementBaseObject)e["TargetInstance"])["Name"].ToString();
    
    Console.WriteLine(EventName);
    
    // salva operacao no log
    EventLog DemoLog = new EventLog("");
    DemoLog.Source = "EntradaLog";
    DemoLog.WriteEntry(EventName, EventLogEntryType.Information);
    
    // pára o watcher
    DemoWatcher.Stop();
    Agora veja se consegue aplicar sua para o seu caso. Dê uma pesquisa em Instrumentation, Management e WMI.

    []s
    Robson Castilho - Desenvolvedor C# - MCTS .Net 2.0 Windows Applications
    • Marcado como Resposta Edgar Esteves domingo, 19 de abril de 2009 11:41
    domingo, 19 de abril de 2009 05:01

Todas as Respostas

  • Olá Edgar,

    Realmente com a classe FileSystemWatcher só é possivel fazer o que voce citou (alem de alteracoes nos arquivos tbem).

    Talvez voce consiga fazer isso utilizando a classe ManagementEventWatcher .
    Apenas para te dar uma ideia, o exemplo abaixo aguarda a execucao de um programa e registra esse operacao no log do Windows:

    // consulta WMI a ser executada
    WqlEventQuery DemoQuery = new WqlEventQuery("__InstanceCreationEvent", new TimeSpan(0, 0, 1), "TargetInstance isa \"Win32_Process\"");
                            
    // instancia watcher 
    ManagementEventWatcher DemoWatcher = new ManagementEventWatcher();
    DemoWatcher.Query = DemoQuery;
    DemoWatcher.Options.Timeout = new TimeSpan(0, 0, 30);
    
    Console.WriteLine("Open an application to trigger an event");
    
    // aguarda execucao de algum programa
    ManagementBaseObject e = DemoWatcher.WaitForNextEvent();
    
    // nome do programa que foi executado
    string EventName = ((ManagementBaseObject)e["TargetInstance"])["Name"].ToString();
    
    Console.WriteLine(EventName);
    
    // salva operacao no log
    EventLog DemoLog = new EventLog("");
    DemoLog.Source = "EntradaLog";
    DemoLog.WriteEntry(EventName, EventLogEntryType.Information);
    
    // pára o watcher
    DemoWatcher.Stop();
    Agora veja se consegue aplicar sua para o seu caso. Dê uma pesquisa em Instrumentation, Management e WMI.

    []s
    Robson Castilho - Desenvolvedor C# - MCTS .Net 2.0 Windows Applications
    • Marcado como Resposta Edgar Esteves domingo, 19 de abril de 2009 11:41
    domingo, 19 de abril de 2009 05:01
  • Obrigado Robson, já estou estudando sua solução!

    Abraços
    Edgar Esteves - www.localdosuporte.com.br
    domingo, 19 de abril de 2009 11:41
  • Robson,
    Na linha:

    WqlEventQuery DemoQuery = new WqlEventQuery("__InstanceCreationEvent", new TimeSpan(0, 0, 1), "TargetInstance isa \"Win32_Process\"");

    Existe alguma possibilidade de filtrar uma pasta?

    Segue exemplo que estou utilizando:


                fsw.Path = tbPasta.Text;
    
                // monitora subdiretorios
                fsw.IncludeSubdirectories = cbSubdiretorio.Checked;
    
                // monitora somente tipos de arquivos escolhidos
                fsw.Filter = tbFiltro.Text;
    
                // lista de atributos que disparam eventos
                fsw.NotifyFilter = NotifyFilters.FileName | NotifyFilters.DirectoryName | NotifyFilters.CreationTime | NotifyFilters.Security | NotifyFilters.Size;
    
                // permite a monitoração
                fsw.EnableRaisingEvents = cbEvento.Checked;

    Obrigado novamente!
    Edgar Esteves - www.localdosuporte.com.br
    domingo, 19 de abril de 2009 12:51
  • Cara,

    Nao sei te dizer (acredito que nao), mas voce pode checar os campos retornados pela consulta, pode ser que haja algum que te informe a pasta de onde foi executado. Como? Dê uma olhada neste programinha:

    http://www.microsoft.com/downloads/details.aspx?FamilyID=2cc30a64-ea15-4661-8da4-55bbc145c30e&displaylang=en

    Ele te mostra todos os namespaces e classes disponiveis no WMI e gera o código prontinho pra vc (em VB e C#). Escolha Win32_Process e ele te informa quais os campos que a consulta retorna.

    []s


    Robson Castilho - Desenvolvedor C# - MCTS .Net 2.0 Windows Applications
    domingo, 19 de abril de 2009 16:53
  • Achei esse artigo interessante, veja se ajuda você ou qualquer outra pessoa que possa acessar esse tópico:
    http://www.linhadecodigo.com.br/artigo/3097/monitorando-arquivos-e-diretorios-com-filesystemwatcher.aspx
    segunda-feira, 4 de junho de 2012 20:48