none
Ajuda FileSystemWatcher RRS feed

  • Pergunta

  • Bom dia.

    Estou utilizando o FileSystemWatcher para monitorar uma pasta de retornos de XML. O problema é que as vezes ele tenta ler um arquivo que ainda esta em uso por outro programas ( o que cria ele ).

    Teria alguma maneira de eu fazer ele aguardar uns 2 segundos antes de disparar o evento? ou existe alguma opção que configuro para ele aguardar?

    private void fileSystemRetornoNFe_Changed(object sender, FileSystemEventArgs e)
            {
                if (Path.GetExtension(e.Name) != ".err" && Path.GetExtension(e.Name) != ".txt")
                {
                    XmlDocument xmlDoc = new XmlDocument();
                    xmlDoc.Load(e.FullPath);//Carregando o arquivo
    
                    //Pegando elemento pelo nome da TAG
                    XmlNodeList xmlNfe = xmlDoc.GetElementsByTagName("infProt");
                    XmlNodeList xmlNfeCan = xmlDoc.GetElementsByTagName("infEvento");
    
                    //Usando foreach para imprimir na tela
                    foreach (XmlNode xn in xmlNfe)
                    {
                        if (xn["xMotivo"].InnerText == "Autorizado o uso da NF-e")
                        {
                            dgvListNFe.Rows[dgvListNFe.CurrentRow.Index].Cells["ColCHAVE_NFE"].Value = xn["chNFe"].InnerText;
                            dgvListNFe.Rows[dgvListNFe.CurrentRow.Index].Cells["ColPROTOCOLO_NFE"].Value = xn["nProt"].InnerText;
                            dgvListNFe.Rows[dgvListNFe.CurrentRow.Index].Cells["ColSITUACAO_NFE"].Value = "AUTORIZADA";
    
                            //Grava o Informações da NF-e no Banco
                            Dados.Variaveis.bsEmissaoNFe.EndEdit();
                            Dados.Variaveis.daEmissaoNFe.Update(Dados.Variaveis.Tabelas.Tables["EMISSAO_NFE"]);
    
                            Espera.Close();
    
                            //Visualiza a NF-e
                            Process.Start(@"C:\Unimake\UniNFe\unidanfe.exe", @" a=C:\Unimake\UniNFe\" + Dados.Variaveis.CNPJEmpresa + @"\NFe\Enviado\Autorizados\2014\08\" + dgvListNFe.CurrentRow.Cells["ColCHAVE_NFE"].Value + "-procNFe.xml");
                        }
                        else
                        {
                            Espera.Close();
                            MessageBox.Show(xn["xMotivo"].InnerText, "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        }
                    }
    
                    //Usando foreach para imprimir na tela
                    foreach (XmlNode xn in xmlNfeCan)
                    {
                        if (xn["xEvento"].InnerText == "Cancelamento registrado")
                        {
                            dgvListNFe.Rows[dgvListNFe.CurrentRow.Index].Cells["ColSITUACAO_NFE"].Value = "CANCELADA";
    
                            //Grava o Informações da NF-e no Banco
                            Dados.Variaveis.bsEmissaoNFe.EndEdit();
                            Dados.Variaveis.daEmissaoNFe.Update(Dados.Variaveis.Tabelas.Tables["EMISSAO_NFE"]);
    
                            Espera.Close();
                        }
                        else
                        {
                            Espera.Close();
                            MessageBox.Show(xn["xMotivo"].InnerText, "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        }
                    }
                }
                else if (Path.GetExtension(e.Name) == ".err")
                {
                    Espera.Close();
                    //List<string> Erro = new List<string>();
                    StreamReader LerErro = new StreamReader(e.FullPath);
                    //Erro.Add(LerErro.ReadToEnd());
                    MessageBox.Show(LerErro.ReadToEnd());
                }
            }

    domingo, 24 de agosto de 2014 14:23

Respostas

  • Parece que deu certo agora.

    Eu coloquei o código abaixo para dar uma pausa e depois continuar, assim ele não vai ler o arquivo em uso.

                Thread.Sleep(2 * 1000);
    
                if (Path.GetExtension(e.Name) != ".err" && Path.GetExtension(e.Name) != ".txt")
                {
                    XmlDocument xmlDoc = new XmlDocument();
                    xmlDoc.Load(e.FullPath);//Carregando o arquivo
    
                    //Pegando elemento pelo nome da TAG
                    XmlNodeList xmlNfe = xmlDoc.GetElementsByTagName("infProt");
                    XmlNodeList xmlNfeCan = xmlDoc.GetElementsByTagName("infEvento");

    Se alguém tiver uma ideia diferente.

    Obrigado...

    domingo, 24 de agosto de 2014 22:14

Todas as Respostas

  • Tente desta forma:

    using System.Timers;  //importe a biblioteca Timers
    
    System.Timers.Timer t = new System.Timers.Timer(); //criei um objeto global para que possa ser acessado de qualquer método.
    
    private void buttonStart_Click(object sender, EventArgs e) //criei um botão para que possa startar o timer.
    
    {
    
    t.Elapsed += new ElapsedEventHandler(fileSystemRetornoNFe_Changed); 
    
    t.Interval = 5000; //irá chamar seu método a cada 5 segundos;
    
    t.enable = true; //ativa o timer;
    
    }
    
    private void buttonStop_Click(object sender, EventArgs e) //Interromper o timer
    
    {
    
    t.stop();
    
    }







    • Editado Supimpa domingo, 24 de agosto de 2014 18:55
    domingo, 24 de agosto de 2014 18:48
  • O evento fileSystemRetornoNFe_Changed, dispara automaticamente toda vez que um arquivo é editado na pasta informada: C:\Unimake\UniNFe\14187247140102\Nfe\Retorno

    Então não consigo travar o mesmo com o time, o que eu poderia tentar é STOPAR a aplicação por 2 segundos quando o evento for chamado

    domingo, 24 de agosto de 2014 21:28
  • Parece que deu certo agora.

    Eu coloquei o código abaixo para dar uma pausa e depois continuar, assim ele não vai ler o arquivo em uso.

                Thread.Sleep(2 * 1000);
    
                if (Path.GetExtension(e.Name) != ".err" && Path.GetExtension(e.Name) != ".txt")
                {
                    XmlDocument xmlDoc = new XmlDocument();
                    xmlDoc.Load(e.FullPath);//Carregando o arquivo
    
                    //Pegando elemento pelo nome da TAG
                    XmlNodeList xmlNfe = xmlDoc.GetElementsByTagName("infProt");
                    XmlNodeList xmlNfeCan = xmlDoc.GetElementsByTagName("infEvento");

    Se alguém tiver uma ideia diferente.

    Obrigado...

    domingo, 24 de agosto de 2014 22:14