VB.NET - Criar, Ler, Escrever, Copiar e Deletar arquivos Textos (revisitado)


 No artigo de hoje eu vou recordar como podemos realizar as operações básicas (criar, ler, escrever, copiar e deletar) em arquivos textos usando a linguagem VB .NET.


Neste artigo, vamos explorar algumas operações que são realizadas com arquivos textos utilizando VB.NET.  A plataforma .NET oferece várias classes, como File e FileInfo, para criar, ler, escrever e executar operações semelhantes em um arquivo texto.

 

Obs: Este artigo complementa e recorda o assunto visto no artigo :  VB.NET - Operações básicas com arquivos - Macoratti.net

Dessa forma, você pode usar o método Create() da classe File para criar um arquivo de texto. Poderia também usar o método CreateText() da classe FileInfo para realizar a mesma tarefa. Da mesma forma essas classes também contêm funcionalidades para copiar, mover ou apagar um arquivo. O truque é saber quando usar cada classe e com que finalidade.

Portanto, os métodos da classe FileInfo são úteis se você planeja usar a mesma instância da classe em várias operações.

No entanto, para copiar, mover ou apagar os arquivos, os métodos estáticos são mais rápidos. Além disso, o coletor de lixo tem menos trabalho a fazer quando você usa a classe File, uma vez que os métodos são estáticos.

Para a leitura e escrita de arquivo texto, temos algumas classes abstratas, como as classes TextReader e TextWriter. Temos também algumas classes úteis, como o StreamReader, StringReader, StreamWriter e StringWriter que derivam dessas classes abstratas.

 

Para ler um arquivo texto utilizaremos a classe StreamReader() criando uma instância da classe e usando o construtor onde informa o nome do arquivo a ser aberto.

 

A seguir temos os principais membros da classe StreamReader:

 

Close() Fecha o StreamReader atual
Dispose() Libera os recursos usado pelo StreamReader
Peek() Retorna o próximo caractere disponível mas não o utiliza
Read() Lê o próximo caractere ou conjunto de caracteres de um stream
ReadBlock() Lê um número específico de caracteres de um stream atual e escreve os dados em um buffer
ReadLine() Lê uma linha de caractere do stream atual e retorna os dados em uma string
ReadToEnd() Lê o stream da posição atual até o fim do stream


Para escrever em arquivos textos
vamos usar a classe StreamWriter. A seguir temos as principais  propriedades e métodos da classe StreamWriter:

 

AutoFlush() Obtém ou define um valor indicando se o StreamWriter irá liberar o buffer no fluxo subjacente após cada chamada a Write.
Close() Fecha o objeto atual de StreamWriter e o fluxo subjacente
Dispose() Libera os recursos usados pelo objeto de TextWriter
Flush() Limpa todos os buffers para o gravador atual e faz com que todos os dados armazenados em buffer sejam gravados no fluxo subjacente.
NewLine()  
Write() Grava no fluxo.
WriteLine() Grava no fluxo seguido de um terminador de linha

 

Para começar temos que referenciar o namespace System.IO e declarar e inicializar uma nova instância de StreamWriter usando um de seus construtores.

StreamWriter writer = new StreamWriter("macoratti.txt")

Nesta declaração um novo StreamWriter é inicializado com o nome do arquivo igual 'macoratti.txt' (você pode usar qualquer extensão como .dat por exemplo)

Se o arquivo não existir ela será criado. No exemplo, como não definimos um local para o arquivo, ele será criado no mesmo diretório da aplicação.


Este artigo não pretende ser um guia completo para demonstrar as capacidades destas classes. Vamos usar uma abordagem 'Como faço para' para demonstrar algumas das capacidades destas classes.

 

No final do artigo vou dar algumas referências para que você obtenha uma melhor compreensão destas classes.

 

Neste projeto para exibir o arquivo texto eu vou usar o controle RichTextBox e para permitir que o usuário selecione um arquivo eu vou usar o controle OpenFileDialog.

 

Nota: O controle OpenFileDialog é usado para localizar e selecionar arquivos em um computador.


Para permitir que o usuário selecione o caminho e o arquivo de destino nas operações de Copiar e Mover arquivo eu vou usar a função InputBox que exibe um prompt em uma caixa de diálogo, aguarda o usuário inserir texto ou clicar em um botão, e depois retorna uma sequência contendo o conteúdo da caixa de texto.

 

Nota: O inputbox exibe um prompt em uma caixa de diálogo que aguarda que um texto seja informado ou um dos botões seja clicado e então retorna uma string contendo o conteúdo do TextBox.

A sintaxe da função é a seguinte:

Dim Prompt As String
Dim Titulo As String
Dim respostaPadrao As String
Dim XPos As Integer
Dim YPos As Integer
Dim valorRetornado As String


valorRetorando = InputBox(Prompt, Titulo, respostaPadrao, XPos, YPos)


Recursos usados:

Criando o projeto no Visual Studio 2013 Express for windows desktop

Abra o VS 2013 Express for windows desktop e clique em New Project;

Selecione a linguagem Visual Basic e o template Windows Forms Application;

Informe o nome Operacoes_Basica_Com_ArquivosTexto e clique no botão OK;

 

Formulário principal do projeto form1.vb inclua os seguinte controles a partir da ToolBox:

Disponha os controles no formulário form1.vb conforme o leiaute abaixo:

 

Após isso declare no início do formulário os namespaces:

Imports System.Security
Imports
System.IO
Imports
System.Text  

Agora vamos definir em cada evento Click dos botões de comando o código pertinente a cada tarefa:

Código do botão - btnLocalizar - que abre uma caixa de diálogo Abrir Arquivo permitindo a seleção de um arquivo texto existente:

 Private Sub btnLocalizar_Click(sender As Object, e As EventArgs) Handles btnLocalizar.Click
        'define as propriedades do controle 
        'OpenFileDialog
        Me.ofd1.Multiselect = True
        Me.ofd1.Title = "Selecionar Arquivo"
        ofd1.InitialDirectory = "C:\dados"
        'filtra para exibir somente arquivos de imagens
        ofd1.Filter = "Texto (*.txt)|*.txt|" + "Todos (*.*)|*.*"
        ofd1.CheckFileExists = True
        ofd1.CheckPathExists = True
        ofd1.FilterIndex = 1
        ofd1.RestoreDirectory = True
        ofd1.ReadOnlyChecked = True
        ofd1.ShowReadOnly = True
        'abre a caixa de diálogo
        Dim dr As DialogResult = Me.ofd1.ShowDialog()
        If dr = System.Windows.Forms.DialogResult.OK Then
            Try
                'obtem o nome do arquivo texto selecionado
                txtArquivoTexto.Text = ofd1.FileName
            Catch ex As SecurityException
                ' O usuário  não possui permissão para ler arquivos
                MessageBox.Show("Erro de segurança Contate o administrador de segurança da rede." & vbLf & vbLf + "Mensagem : " 
+ ex.Message + vbLf & vbLf + "Detalhes (enviar ao suporte):" & vbLf & vbLf + ex.StackTrace)
            Catch ex As Exception
                ' Ocorreu um erro ao selecionar o arquivo
                MessageBox.Show("Erro : " + ex.Message, "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error)
            End Try
        End If
    End Sub

1- Criar Arquivo Texto

 Private Sub btnCriar_Click(sender As Object, e As EventArgs) Handles btnCriar.Click
        'verifica se o nome do arquivo foi informado
        Dim caminho As String = ""
        If Not String.IsNullOrEmpty(txtArquivoTexto.Text) Then
            caminho = txtArquivoTexto.Text
        Else
            MessageBox.Show("Informe o nome do arquivo texto ", "Informe o nome do arquivo", MessageBoxButtons.OK, MessageBoxIcon.Information)
            txtArquivoTexto.Focus()
            Return
        End If
        'verifica se o arquivo existe
        If Not File.Exists(caminho) Then
            ' Cria um arquivo para escrita
            Using sw As FileStream = File.Create(caminho)
                Dim texto As Byte() = New UTF8Encoding(True).GetBytes("Macoratti .net - Quase tudo para Visual Basic")
                sw.Write(texto, 0, texto.Length)
            End Using
            ' Abre o arquivo para leitura
            Using sr As StreamReader = File.OpenText(caminho)
                rtbTexto.Text = sr.ReadToEnd
            End Using
        Else
            MessageBox.Show("Ja existe um arquivo com esse nome ", "Informe o nome do arquivo", MessageBoxButtons.OK, MessageBoxIcon.Information)
            Return
        End If
    End Sub

2- Escrever em arquivo texto

 Private Sub btnEscrever_Click(sender As Object, e As EventArgs) Handles btnEscrever.Click
      'verifica se o nome do arquivo foi informado
        Dim caminho As String = ""
        If Not String.IsNullOrEmpty(txtArquivoTexto.Text) Then
            caminho = txtArquivoTexto.Text
        Else
            MessageBox.Show("Informe o nome do arquivo texto ", "Nome do arquivo", MessageBoxButtons.OK, MessageBoxIcon.Information)
            txtArquivoTexto.Focus()
            Return
        End If
         'verifica se o arquivo existe
        If File.Exists(caminho) Then
            Using sw As StreamWriter = New StreamWriter(caminho, True)
                sw.WriteLine()
                sw.WriteLine("Visual Basic")
                sw.WriteLine("http://www.macoratti.net")
                sw.WriteLine("Macoratti .net")
            End Using
            ' Abre o arquivo para leitura
            Using sr As StreamReader = File.OpenText(caminho)
                rtbTexto.Text = sr.ReadToEnd
            End Using
        Else
            MessageBox.Show("Arquivo não encontrado ", "Nome do arquivo", MessageBoxButtons.OK, MessageBoxIcon.Information)
        End If
    End Sub

3- Ler arquivo texto

Private Sub btnLer_Click(sender As Object, e As EventArgs) Handles btnLer.Click
       'verifica se o nome do arquivo foi informado
        Dim caminho As String = ""
        If Not String.IsNullOrEmpty(txtArquivoTexto.Text) Then
            caminho = txtArquivoTexto.Text
        Else
            MessageBox.Show("Informe o nome do arquivo texto ", "Informe o nome do arquivo", MessageBoxButtons.OK, MessageBoxIcon.Information)
            txtArquivoTexto.Focus()
            Return
        End If
        'verifica se o arquivo existe
        If File.Exists(caminho) Then
            Using tr As TextReader = New StreamReader(caminho)
                rtbTexto.Text = tr.ReadToEnd()
            End Using
        Else
            MessageBox.Show("Arquivo não encontrado ", "Nome do arquivo", MessageBoxButtons.OK, MessageBoxIcon.Information)
        End If
    End Sub

4- Copiar arquivo texto

   Private Sub btnCopiar_Click(sender As Object, e As EventArgs) Handles btnCopiar.Click
        'define os parâmetros usados no inputbox
        Dim Prompt As String = "Informe o nome e local do arquivo de destino "
        Dim Titulo As String = "Procurar por nome"
        Dim respostaPadrao As String = "c:\dados\testecopia.txt"
        Dim XPos As Integer = 750
        Dim YPos As Integer = 300
        Dim caminhoArquivoDestino As String
        'verifica se o nome do arquivo foi informado      
        Dim caminho As String = ""
        If Not String.IsNullOrEmpty(txtArquivoTexto.Text) Then
            caminho = txtArquivoTexto.Text
        Else
            MessageBox.Show("Informe o nome do arquivo texto ", "Informe o nome do arquivo", MessageBoxButtons.OK, MessageBoxIcon.Information)
            txtArquivoTexto.Focus()
            Return
        End If

        'obtem a entra do usuário
        caminhoArquivoDestino = InputBox(Prompt, Titulo, respostaPadrao, XPos, YPos)
        'verifica se o arquivo de destino informado é válido
        If Not String.IsNullOrEmpty(caminhoArquivoDestino) Then
            'verifica se o arquivo existe
            If File.Exists(caminho) Then
                ' Se o arquivo de destino existe deleta
                If File.Exists(caminhoArquivoDestino) Then
                    File.Delete(caminhoArquivoDestino)
                End If
                'copia o arquivo de origem para o destino
                File.Copy(caminho, caminhoArquivoDestino)
                MessageBox.Show("Arquivo copiado com sucesso", "Cópia", MessageBoxButtons.OK, MessageBoxIcon.Information)
            Else
                MessageBox.Show("Arquivo não encontrado ", "Nome do arquivo", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End If
        Else
            MessageBox.Show("Arquivo de destino inválido ", "Informe o nome e caminho do arquivo de destino", MessageBoxButtons.OK, MessageBoxIcon.Information)
        End If
    End Sub

5- Mover arquivo texto

Private Sub btnMover_Click(sender As Object, e As EventArgs) Handles btnMover.Click
        'define os parâmetros usados no inputbox
        Dim Prompt As String = "Informe apenas o local do arquivo de destino "
        Dim Titulo As String = "Procurar por nome"
        Dim respostaPadrao As String = "c:\dados\"
        Dim XPos As Integer = 750
        Dim YPos As Integer = 300
        Dim caminhoArquivoDestino As String
        'verifica se o nome do arquivo foi informado  
        Dim caminho As String = ""
        If Not String.IsNullOrEmpty(txtArquivoTexto.Text) Then
            caminho = txtArquivoTexto.Text
        Else
            MessageBox.Show("Informe o nome do arquivo texto ", "Nome do arquivo", MessageBoxButtons.OK, MessageBoxIcon.Information)
            txtArquivoTexto.Focus()
            Return
        End If
       'obtem a entra do usuário
        caminhoArquivoDestino = InputBox(Prompt, Titulo, respostaPadrao, XPos, YPos)
        'verifica se o arquivo de destino informado é válido
        If Not String.IsNullOrEmpty(caminhoArquivoDestino) Then
            ' Cria um arquivo com nome unico
            Dim fileLocMove As String = caminhoArquivoDestino & "teste1" & System.DateTime.Now.Ticks & ".txt"
            'verifica se o arquivo origem existe
            If File.Exists(caminho) Then
                'move o arquivo 
                File.Move(caminho, fileLocMove)
                MessageBox.Show("Arquivo movido com sucesso", "Mover arquivo", MessageBoxButtons.OK, MessageBoxIcon.Information)
            Else
                MessageBox.Show("Arquivo não encontrado ", "Nome do arquivo", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End If
        Else
            MessageBox.Show("Arquivo de destino inválido ", "Informe o nome e caminho do arquivo de destino", MessageBoxButtons.OK, MessageBoxIcon.Information)
        End If
    End Sub
 

6- Deletar arquivo texto

Private Sub btnDeletar_Click(sender As Object, e As EventArgs) Handles btnDeletar.Click
        'verifica se o nome caminho do arquivo foram informados
        Dim caminho As String = ""
        If Not String.IsNullOrEmpty(txtArquivoTexto.Text) Then
            caminho = txtArquivoTexto.Text
        Else
            MessageBox.Show("Informe o nome do arquivo texto ", "Nome do arquivo", MessageBoxButtons.OK, MessageBoxIcon.Information)
            txtArquivoTexto.Focus()
            Return
        End If
        'verifica se o arquivo origem existe
        If File.Exists(caminho) Then
            'deleta o arquivo
            File.Delete(caminho)
            MessageBox.Show("Arquivo deletado com sucesso", "Deletar arquivo", MessageBoxButtons.OK, MessageBoxIcon.Information)
            'limpa o conteúdo do RichTextBox
            rtbTexto.Clear()
        Else
            MessageBox.Show("Arquivo não encontrado ", "Informe o nome do arquivo", MessageBoxButtons.OK, MessageBoxIcon.Information)
        End If
    End Sub

7- Sair

Private Sub btnSair_Click(sender As Object, e As EventArgs) Handles btnSair.Click

    Me.Close()

End Sub

Executando o projeto iremos obter o seguinte resultado após realizar algumas operações:

Sugestões para melhorar o projeto:

- Remover o código duplicado para verificar se o arquivo informado é válido criando uma função para isso.

Pegue o projeto completo aqui:   Operacoes_Basica_Com_ArquivosTexto.zip

E, porque sois filhos, Deus enviou aos vossos corações o Espírito de seu Filho, que clama: Aba, Pai.
Assim que já não és mais servo, mas filho; e, se és filho, és também herdeiro de Deus por Cristo.

Gálatas 4:6,7

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti