none
Problema na Leitura de arquivo texto com StreamReader (C#) RRS feed

  • Pergunta

  • Prezados colegas.

    Possuo um aplicação que possui um form que quando carregado efetua a leitura de 
    um arquivo texto, da primeira linha até a última, com StreamReader. O problema é que não consigo ler 2 vezes consecutivas este mesmo arquivo. A única maneira de ler o arquivo novamente é fechando todo o sistema e iniciando novamente. Na primeira leitura, ao final executo o fechamento da instância. Ex. Instancia.Close(). Porém fazendo uma depuração verifico que antes de executar o método Close a instância está com a mensagem:

    EndOfStream = 'srv.EndOfStream' gerou uma exceção do tipo System.ObjectDisposedException'.

    Continuo a executando, e fecho este formulário. Quando carrego novamente o form, pela segunda vez consecutiva, quando irá executar o While a instância já está como o mesmo erro e o While é encerrado indicando que já chegou no final do arquivo.

    Como pode ser o final do arquivo, se teóricamente foi fechado ao final da primeira execução e quando carrego novamente a leitura deveria começar do ínicio sem maiores problemas.

    Pode por favor me dar uma idéia do que ocorre?.

    Obrigado.
    quinta-feira, 19 de julho de 2018 03:53

Todas as Respostas

  • Olá,

    Se você não está usando o using() para o StreamReader, voc~e precisa chamar o método Dispose() além do Close(), para destruir o objeto em memória e então na próxima execução ele vai recriar o objeto novamente.

    Sugiro fortemente utilizar o using neste caso:

            using (StreamReader reader = new StreamReader("C:\\programs\\file.txt"))
            {
                while (true)
                {
                    string line = reader.ReadLine();
                    if (line == null)
                    {
                        break;
                    }
                    Console.WriteLine(line); // Use line.
                }
            }
    

    O using faz o tratamento do Close() e Dispose() automaticamente.


    Fabio Rosa.

    quinta-feira, 19 de julho de 2018 11:32
  • Olá Fábio.

    Entendi sua sugestão e pretendo adotá-la.

    Neste caso especifico não sei se conseguirei. Irei colocar o código para você poder analisar, possível é claro.

    Obrigado pela ajuda.

    using System;
    using System.Windows.Forms;
    using System.IO;

    namespace TesteStreamReaderACBRSAT
    {
        public partial class LeituraArquivo : Form
        {
            static string linha;

            static string ArquivoVendaIni = "C:\\SAT\\VENDA.INI";
            static string ArquivoEntrada = @"C:\SAT\ENT.TXT";

            static StreamReader srv = new StreamReader(ArquivoVendaIni);
            static StreamWriter swe = new StreamWriter(ArquivoEntrada, true);

            public LeituraArquivo()
            {
                InitializeComponent();
            }

            private void LeituraArquivo_Load(object sender, EventArgs e)
            {
                LerArquivo();
            }

            public static void LerArquivo()
            {
                if (File.Exists(ArquivoVendaIni))
                {
                    try
                    {
                        while ((linha = srv.ReadLine()) != null)
                        {
                            VerQualEmpresa();

                            GravarArquivo();
                        }

                        swe.Close();
                    }
                    catch (Exception ex)
                    {
                        //MessageBox.Show(ex.Message);
                    }
                }
                else
                {
                    //MessageBox.Show(" O arquivo " + arquivo + " não foi localizado");
                }
            }

            private static void GravarArquivo()
            {
                swe.WriteLine(linha);
            }

            private static void VerQualEmpresa()
            {
                if (true)  // Aqui se uma determinada condição for verdadeira deve-se ler algumas
                           // linhas do arquivo e depois a leitura continua no método LeituraArquivo()
                {
                    while ((linha = srv.ReadLine()) != null)
                    {
                        GravarArquivo();
                    }
                }
            }
        }
    }

    quinta-feira, 19 de julho de 2018 16:35
  • Olha... acho que assim pode funcionar:

    using System; using System.Windows.Forms; using System.IO; namespace TesteStreamReaderACBRSAT { public partial class LeituraArquivo : Form { static string linha; static string ArquivoVendaIni = "C:\\SAT\\VENDA.INI"; static string ArquivoEntrada = @"C:\SAT\ENT.TXT"; static StreamWriter swe = new StreamWriter(ArquivoEntrada, true); public LeituraArquivo() { InitializeComponent(); } private void LeituraArquivo_Load(object sender, EventArgs e) { LerArquivo(); } public static void LerArquivo() { if (File.Exists(ArquivoVendaIni)) { try {

    using(var srv = new StreamReader(ArquivoVendaIni))

    { while ((linha = srv.ReadLine()) != null) { VerQualEmpresa(srv); GravarArquivo(); } } } catch (Exception ex) { //MessageBox.Show(ex.Message); } } else { //MessageBox.Show(" O arquivo " + arquivo + " não foi localizado"); } } private static void GravarArquivo() { swe.WriteLine(linha); } private static void VerQualEmpresa(StreamReader srv) { if (true) // Aqui se uma determinada condição for verdadeira deve-se ler algumas // linhas do arquivo e depois a leitura continua no método LeituraArquivo() { while ((linha = srv.ReadLine()) != null) { GravarArquivo(); } } } } }



    Fabio Rosa.

    quinta-feira, 19 de julho de 2018 16:48
  • Perfeito Fábio.

    Fiz uns ajustes para minha necessidade, mas agora está uma beleza.

    Cara que mágico este instanciamento. Adorei.

    Muito obrigado, espero aprender cada vez mais.

    Valeu pela força e pela disposição. Sem palavras.

    Um grande abraço.

    quinta-feira, 19 de julho de 2018 20:08
  • Fábio a propósitom, se me permite abusar. No código abaixo que tem 2 instanciamentos, como ficaria o "using" ?.

    if (File.Exists(ArquivoVendaIni))

                {
                    var srv = new StreamReader(ArquivoVendaIni);
                    var swe = new StreamWriter(ArquivoEntrada, true);

                    try
                    {
                        while ((linha = srv.ReadLine()) != null)
                        {
                            VerQualEmpresa(srv, swe);

                            GravarArquivo(swe);
                        }

                        swe.Close();
                        srv.Close();
                    }
                    catch (Exception ex)
                    {
                        //MessageBox.Show(ex.Message);
                    }
                }

    Obrigado.

    quinta-feira, 19 de julho de 2018 20:14
  • Você pode colocar um using dentro do outro.

    Fabio Rosa.

    • Sugerido como Resposta Fabio Rosa quinta-feira, 14 de março de 2019 18:40
    quinta-feira, 19 de julho de 2018 20:17
  • Ok.

    Obrigado.

    quinta-feira, 19 de julho de 2018 21:01