Compartilhar via


Manipulação de Arquivos com StreamReader e StreamWriter

Dentre as várias classes com as quais podemos manipular arquivos, a StreamReader e StreamWriter são as mais comuns para fazer leitura e gravação, respectivamente. No exemplo a seguir, criei uma aplicação em WPF para ilustrar a utilização delas.

Nós vamos gravar um arquivo texto, oriundo de um StringBuilder, na pasta que o usuário preferir, utilizando para isto a classe FolderBrowserDialog nesta abordagem. Alternativamente, você pode instanciar um SaveFileDialog, que abre uma outra janela do Windows para salvar um arquivo num diretório.

Ao manipular arquivos, é recomendável escrever as instruções dentro de um bloco using, que se encarrega de dar dispose dos recursos utilizados em memória.

O construtor do StreamWriter precisa de um path válido. Então, após escolher a pasta, a variável directory será concatenada com o nome do arquivo.

Ex: C:\Users\Thiago\Desktop\Teste.txt

Obs.: O atributo append pode ser setado como true, caso queira sobrescrever um mesmo arquivo. Caso passe false ou nada, um novo arquivo será gerado.

private void btnGerarArquivo_Click(``object sender, RoutedEventArgs e)

{

      ``string text = GetText();

** **

       ``var browserDialog = ``new FolderBrowserDialog()

       ``{

             ``Description = ``"Por favor selecione uma pasta:"``,

             ``ShowNewFolderButton = ``true

       ``};

** **

       ``if (browserDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)

       ``{

              ``string directory = browserDialog.SelectedPath;

              ``string fileName = ``"Teste.txt"``.Insert(0, ``"\\"``);

** **

              ``using (``var writer = ``new StreamWriter(``string``.Concat(directory, fileName), ``true``))

              ``{

                    ``writer.WriteLine(text);

** **

                    ``System.Windows.MessageBox.Show(``"Arquivo criado com sucesso no diretório: " + directory);

              ``}

       ``}

}

Se não passar o nome do arquivo, só o diretório é lançada a UnauthorizedAccessException.

using`` ``(``var`` ``writer = ``new`` ``StreamWriter(``"C:\\Users\\Thiago\\Desktop"``, ``true``))

Se passar somente o nome do arquivo, ele o salva no mesmo diretório onde está salvo o seu projeto.

Ex: VS2013\Projects\Nome_Projeto\bin\Debug\Teste.txt

using`` ``(``var`` ``writer = ``new`` ``StreamWriter(``"Teste.txt"``, ``true``))

Agora, para a leitura, criamos um OpenFileDialog para o usuário escolher o arquivo a ser aberto e o texto será mostrado num TextBox na tela. O método ReadToEnd é responsável de ler todos os caracteres do começo ao fim do arquivo. Ainda, essa operação foi feita dentro de um bloco using:

private void btnLerArquivo_Click(``object sender, RoutedEventArgs e)

{

    ``var openFileDialog = ``new OpenFileDialog();

** **

    ``if (openFileDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)

    ``{

         ``using (``var reader = ``new StreamReader(File.OpenRead(openFileDialog.FileName)))

         ``{

            ``txtBox1.Text = reader.ReadToEnd();

         ``}

    ``}

}

 De fato, outras classes como Directory, Path e FileInfo são utilizadas exaustivamente para manipular informações de arquivos, diretórios e extensões. Há inúmeras maneiras possíveis de abordar esse cenário, inclusive.

Um abraço e até a próxima,

Thiago