Gravando e Lendo dados em arquivo texto com Csharp

Utilizando a classe system.io podemos utilizar os métodos StreamWriter e StreamReader para leitura e escrita.

PDO com PHP: Aprenda a fazer um CRUD com MySQL

Gravar e ler informações em arquivos texto é algo que toda linguagem atualmente é capaz de fazer, no C# não é diferente, nesta matéria será apresentado como desenvolver uma aplicação, onde poderão ler e gravar informações em um arquivo texto.

Para isto vamos usar o Visual Studio da Microsoft, aqui vou usar a versão 2013, mas a versão 2010 Express funciona tranquilamente.

Para quem trabalha com Unity 3D, as mesmas explicações aqui são válidas para ser utilizada em seus scripts.

Vamos criar um novo projeto, para isto File -> New Project, Windows Form Application, atribua o nome de Persistencia, desmarcar a opção Create Directory for Solution e clique em OK.

Agora precisamos inserir os objetos para nosso formulário, Renomear cada objeto, atribuir um Texto e posicionar corretamente.

Abaixo confira a lista de objetos e os nomes que devem ser adicionado e o texto para cada um, fica a critério do desenvolvedor. 

Componente Quantidade Nome
TextBox 2 txtNome, txtEmail
Label 3 lbNome, lbEmail, lbDescricao
RichTextBox 1 rtbDescricao
Button 2 btnGravar, btnLer

Organize seu formulário como mostrado abaixo.

Agora vamos criar uma nova classe, esta classe vai conter nossos métodos de Ler e Gravar dados no arquivo texto, para criar uma classe é muito simples, clique com o botão direito do mouse em cima do nosso projeto na aba Solution Explorer, em seguida clique em ADD, Class.

De o nome de arquivoTexto.cs, não esqueça de colocar a extensão .cs, pois sem ele não será uma classe.

Note que em nosso projeto agora já é possível visualizar nossa classe, que acabamos de criar, de um duplo clique na mesma para abrir nossa classe e começarmos a programar.

Agora insira os códigos abaixo, cada linha está comentada, então preste atenção para que entenda corretamente.

No using adicione, System.IO;

Código 01:

private static string _file = "usuario.txt";

        //Método que cria o arquivo txt caso ele não exista, Void por que não retorna nada.
        private static void verifyFile()
        {
            if (!File.Exists(_file))//Verifica se o arquivo existe, retorna true, neguei a condição, então se o arquivo não existir ele entra no IF.
            {
                File.Create(_file);//Cria um arquivo, no caso, cria o arquivo informado na variável _file.
            }
        }
        public static void writeData(String nome, String email, String descricao)
        {
            verifyFile(); //Chama nosso método que cria o arquivo caso ele não exista.

            StreamWriter streamW = new StreamWriter(_file, true);
            /*Criamos um novo objeto do tipo StreamWriter, passamos o nome do nosso arquivo.
             * o true informa que deve continuar gravando no arquivo, isto quer dizer que ele não vai limpar e escrever tudo de novo.
             * Se remover o true toda vez que for gravar uma informação nosso arquivo será limpado e as informações anteriores serão perdidas.
             */

            streamW.WriteLine("Nome: " + nome + "| E-mail: " + email + "| Descrição: " + descricao);
            /*Através do objeto streamW acessamos o método WriteLine e passamos os textos que queremos gravar.
             * 
             */

            streamW.Close();//Sempre que terminarem de ler e gravar em um arquivo é necessário fecha-lo, isto evita mutios erros.
        }

Vamos entender melhor cada parte do nosso código que seja fundamental.

File.Exists() – File.Exists verifica se um determinado arquivo existe, isto para qualquer extensão, é necessário passar o nome e caminho do arquivo, neste caso o arquivo está no mesmo diretório do nosso projeto, então não precisamos passar o caminho.

File.Create() – File.Create, como nome já diz, cria um arquivo, para criar o arquivo é necessário passar o nome e extensão junto com o diretório de onde deve ser criado.

StreamWriter streamW = new StreamWriter(dir, true) – A classe StreamWriter escreve dados em arquivos textos, são necessários instancia-lo e passar o diretório do arquivo seguido do nome e extensão do mesmo, o parâmetro adicional true indica que não é para limpar o arquivo toda vez que for gravar algo, as informações que tinham deve continuar a existir.

streamW.WriteLine() – Através da variável StramW acessamos o método WriteLine que grava uma string em um arquivo texto, usando o WriteLine() cada vez que for inserir um informação ele quebra uma linha e depois grava.

streamW.Write () – O Write segue o mesmo padrão do WriteLine, o que muda é que ele não quebra uma linha, escreve tudo em uma única linha, tome cuidado para não confundirem os dois métodos.

streamW.Close() – Fecha a “Conexão” com o arquivo texto, os arquivos são abertos e fechados, nunca se esqueça de fecha-lo, se outro processo precisar do arquivo, poderá resultar em erro, já que o mesmo esta aberto para gravação.

De um duplo clique em nosso botão gravar, depois do Initialize, vamos criar um método que vai limpar nosso formulário, toda vez que necessitarmos limpar o Formulário apenas chamamos o método, não precisamos escrever todo o código várias vezes (reutilização de código, OO).

 

Código 02:

        public void clearForm() { //Método que limpa os formulários.
            txtNome.Text = null; //Atribui um valor vazio ao campo.
            txtEmail.Text = null; //Atribui um valor vazio ao campo.
            rtbDescricao.Text = null; //Atribui um valor vazio ao campo.
        }

Agora no método btnGravar insira o código abaixo.

Código 03:

            arquivoTexto.writeData(txtNome.Text, txtEmail.Text, rtbDescricao.Text);
            /* Acessamos nossa classe em seguida nosso método, como ele espera três String por parÂmetro, 
             * passamos os textos armazenados em nossos campos, devem seguir a mesma ordem que estiver na classe
             * nome, email e descrição.
             */

            clearForm();// Chama o método que limpa nossos formulários.

            MessageBox.Show("Dados gravados.");// Exibe uma mensagem informando que os dados foram gravados.

Vamos entender o que programamos agora.

arquivoTexto.writeData(txtNome.Text, txtEmail.Text, rtbDescricao.Text) – Acessamos nossa classe arquivoTexto em seguida nosso método writeData que grava os dados no txt, nosso método espera por parâmetro três string, que são nome, email e telefone, então passamos os respectivos valores correspondentes aos nossos campos, sempre devemos passar os valores na mesma ordem que está no método.

Execute nossa aplicação e verá o resultado, você pode navegar até a pasta bin do nosso projeto e ver que nosso arquivo foi criado e que há informações dentro dele.

Para finalizamos vamos agora criar o método que vai ler os dados contidos em nosso arquivo texto, para isto vamos jogar o resultado em um alert, nada impede que você jogue estes mesmos dados no próprio formulário. Volte a nossa classe e insira os códigos abaixo.

Código 04:

public static string readFile() {

            string text = ""; //Criamos uma variável que vai armazenar o resultado da nossa consulta no arquivo.

            verifyFile(); //Chamamos novamente nosso método, caso o arquivo não exista ele cria, pois se o arquivo não existir e ele tentar ler vai travar o sistema
            
            StreamReader streamR = new StreamReader(_file); //Criamos um novo objeto que acessa os métods de leitura, passamos o arquivo que quremos ler.

           text = streamR.ReadLine(); // Variavel Text recebe a leitura do arquivo.
            /*Neste exemplo ele vai ler apenas a primeira linha.
             * Caso queria retornar todas, basta usar.
             * 
                while(streamR.EndOfStream == false){
                 text += streamR.ReadLine();
                }
             * 
             * Se for retornar todos os valores, o recomendavel é que grave cada linha em um vetor.
             */

            streamR.Close(); // Finaliza o uso do nosso arquivo.

            return text; //Retorna nossa variável com o texto do arquivo.
        }

StreamReader streamR = new StreamReader(file) – Cria um novo objeto para leitura, é necessário passar o diretório seguido do arquivo com extensão.

streamR.ReadLine() – Ler as informações contidas no arquivo texto.

Para finalizamos nossos códigos, de um duplo clique em nosso botão de ler e insira o código abaixo.

Código 05:

            String[] text = arquivoTexto.readFile().Split('|');
            /* Criamos um vetor de string que vai armazenas os pedaços do nosso texto que é retornado
             * Nosso texto é gravado com o | então para cada | será quebrado e armazenado em uma posição do nosso vetor
             * Neste caso nosso vetor de string tem 3 posições, 0,1 e 2.
             * o Split('|') quebra uma string em certo ponto.
             */

            MessageBox.Show(text[0] + "\n" + text[1] + "\n" + text[2]);
            /*
             * Exibimos nosso nome acessando a posição 0 do nosso vetor, em seguida concatenamos com uma quebra de linha e assim por diante.
             */

Execute nosso programa e verá que agora além de gravar nosso sistema também está lendo os texto do nosso arquivo.

Esta mesma estrutura de códigos é válida para o Console, o que muda é que não temos campo de texto, abaixo o código fina.

Código 06:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Persistencia
{
    public partial class frmPersistencia : Form
    {
        public frmPersistencia()
        {
            InitializeComponent();
        }

        public void clearForm() { //Método que limpa os formulários.
            txtNome.Text = null; //Atribui um valor vazio ao campo.
            txtEmail.Text = null; //Atribui um valor vazio ao campo.
            rtbDescricao.Text = null; //Atribui um valor vazio ao campo.
        }
        private void frmPersistencia_Load(object sender, EventArgs e)
        {

        }

        private void btnGravar_Click(object sender, EventArgs e)
        {
            arquivoTexto.writeData(txtNome.Text, txtEmail.Text, rtbDescricao.Text);
            /* Acessamos nossa classe em seguida nosso método, como ele espera três String por parÂmetro, 
             * passamos os textos armazenados em nossos campos, devem seguir a mesma ordem que estiver na classe
             * nome, email e descrição.
             */

            clearForm();// Chama o método que limpa nossos formulários.

            MessageBox.Show("Dados gravados.");// Exibe uma mensagem informando que os dados foram gravados.
        }

        private void btnLer_Click(object sender, EventArgs e)
        {
            String[] text = arquivoTexto.readFile().Split('|');
            /* Criamos um vetor de string que vai armazenas os pedaços do nosso texto que é retornado
             * Nosso texto é gravado com o | então para cada | será quebrado e armazenado em uma posição do nosso vetor
             * Neste caso nosso vetor de string tem 3 posições, 0,1 e 2.
             * o Split('|') quebra uma string em certo ponto.
             */

            MessageBox.Show(text[0] + "\n" + text[1] + "\n" + text[2]);
            /*
             * Exibimos nosso nome acessando a posição 0 do nosso vetor, em seguida concatenamos com uma quebra de linha e assim por diante.
             */
        }
    }
}