VB.NET - Tratamento de Arquivos : questões práticas


 

Como ler e escrever em um arquivo texto ? Como comparar dois arquivos ? como realizar operações básicas como: copiar, excluir, mover, etc. ? Como saber o tamanho de um arquivo ? Como ...?  Como... ?

 

Este artigo vai procurar dar as respostas para a maioria destas interrogações de uma forma prática, objetiva e direta...

 

Estarei usando o Visual Basic 2005 Express Edition , que , como você já deve saber é grátis. Ainda não pegou ??? pois pegue já no link : http://msdn.microsoft.com/vstudio/express/vb/

 

1- Como ler e escrever em arquivos ?

 

Pode ir se acostumando, na plataforma .NET quando você desejar realizar uma tarefa a primeira coisa que deve saber é quais classes tratam do assunto e aonde elas estão agrupadas. Em outras palavras você precisa saber em qual namespace (espaço de nomes) estão as classes que vão resolver o seu problema.

 

Quando o assunto e tratamento de arquivos o namespace é System.IO. Neste namespace estão as classes que tratam arquivos textos, arquivos binários, diretórios e streams de bytes.(fluxo de bytes)

 

a-) Arquivos Textos

 

Antes de partir para ler/escrever em arquivos textos vamos precisar criar um novo arquivo ou abrir um arquivo já existente. Estas tarefas podem ser feitas usando a classe File do namespace System.IO. Esta classe contém métodos para as operações de copiar, deletar, verificar se um arquivo existe, etc.  A seguir estou listando os principais métodos da classe File:

 

 Método Descrição
 Copy  Copia um Arquivo
 Create  Cria um novo diretório
 CreateText  Cria um arquivo texto
 Delete  Exclui um arquivo
 Exists  Retorna True se o arquivo existir
 Open  Abre um arquivo para leitura/gravação
 OpenRead  Abre o arquivo para leitura
 OpenText  Abre arquivos texto apenas para leitura
 OpenWrite  Abre um arquivo sempre para gravação

Nota: A classe Directory  possui métodos para tratar com diretórios.

 

Para criar um arquivo texto usamos o método CreateText e para abrir um arquivo já existente usamos o método OpenText.

 

- O método CreateText cria um arquivo texto e retorna um objeto do tipo StreamWriter , com este objeto você pode escrever no arquivo.

- Os métodos da classe StreamWriter para escrever no arquivo texto são : Write e WriteLine. A diferença entre os métodos e que o método WriteLine inclui um caractere de nova linha(vbcrlf) no fim da linha enquanto que Write não inclui este caractere.

- Ambos os métodos suportam a formatação do texto usando métodos sobrecarregados . Exemplo:
 

objWrite.WriteLine(“{0,10}{1,10}{2,25}”, “Data”, “Hora”, “Preço”)
objWrite.WriteLine(“{0,10:dd MMMM}{0,10:hh:mm tt}{1,25:C}”, Now(), 13455.33)
objWrite.Close()

 

Formatação usada Resultado obtido

{0,10:dd MMMM} - formata a data  (dia, mês)

{0,10:hh:mm tt} - formata a hora  (hh:mm)

{1,25:C}             - formata o valor (moeda local) 

Data        Hora       Preço
30 julho   01:05      R$ 13.455,33
 

Obs:  O primeiro número indica o índice do item a ser exibido e o segundo número representa o tamanho do campo no qual o parâmetro será exibido.

 

- O método OpenText abre um arquivo texto já existente e retorna um objeto do tipo StreamWriter , com este objeto você pode ler no arquivo.

 

- A leitura pode ser feita dos seguintes modos:
 

a-) Ler linha a linha - Podemos ler cada linha usando o método ReadLine. Para verificar se alcançamos o fim do arquivo chamamos o método Peek do objeto StreamReader. O método Peek lê o próximo caractere no arquivo sem alterar a posição atual de leitura. Se o final do arquivo for encontrado será retornado o valor -1.

 

b-) Ler o arquivo inteiro :  Para ler o arquivo inteiro da posição atual até o fim do arquivo você usa o método ReadToEnd.

 

c-) Ler caractere a caractere - Para ler um caractere por vez você usa o método Read. Este método retorna o valor inteiro do caractere para cada caractere lido. Para saber se o final do arquivo foi alcançado usamos o método Peek da mesma forma que indicada no item a.

 

Vamos agora mostrar como podemos abrir para leitura e em seguida escrever em arquivos textos. Crie um novo projeto no VB 2005 chamado arquivosLerEscrever()  e no formulário padrão form1.vb inclua os seguintes controles: TextBox e Button , conforme figura abaixo:

 

 

Poderemos criar funções para acessar e escrever arquivos textos diretamente no formulário mas vou criar uma classe contendo métodos de forma que no formulário irei apenas instanciar a classe e usar os métodos criados.

 

Inclua um módulo de classe no projeto para isto clique com o botão direito sobre o nome do projeto e selecione as opções Add e a seguir New Item e a seguir selecione o template Class dando ao mesmo o nome de trataArquivoFuncoes.vb

 

Inclua a seguir os seguintes métodos na classe trataArquivoFuncoes:

 

Imports System.io

Public Class trataArquivoFuncoes

    Public Function leTextoDoArquivo(ByVal nomeArquivo As String) As String
        ' Retorna um texto do arquivo definido
        Dim arquivoTexto As String
        ' abre o arquivo e iniciao o objeto StreamReader
        Try
            Dim leitor As StreamReader = File.OpenText(nomeArquivo)
            ' Le todo o texto ate o fim
            arquivoTexto = leitor.ReadToEnd
            ' fecha o stream
            leitor.Close()
            ' Retorna os dados
            Return arquivoTexto
        Catch ex As Exception
            'lança a exceção
            Throw ex
        End Try
    End Function
 
    Public Sub escreverTextoParaArquivo(ByVal nomeArquivo As String, ByVal Texto As String)
        Try
            ' Escreve o texto no arquivo especificado
            ' Cria o arquivo e o objeto  StreamWriter
            Dim escritor As StreamWriter = File.CreateText(nomeArquivo)
            ' Escreve o texto para o stream
            ' Exemplo de texto formatado
            escritor.WriteLine("{0,15}{1,20}{2,25}", "Data", "Hora", "Preço")
            escritor.WriteLine("{0,12:dd MMMM}{0,18:hh:mm tt}{1,26:C}", Now(), 13455.33)
            'escreve linha em branco
            escritor.WriteLine()
            escritor.Write(Texto)
            ' Fecha o stream
            escritor.Close()
        Catch ex As Exception
            Throw (ex)
        End Try
    End Sub
 
    Public Function lerLinhaPorLinha(ByVal nomeArquivo As String) As String
        ' Retorna um texto do arquivo definido
        Dim linhaTexto As String = ""
        ' abre o arquivo e iniciao o objeto StreamReader
        Try
            Dim leitor As StreamReader = File.OpenText(nomeArquivo)
            While leitor.Peek <> -1
                linhaTexto += leitor.ReadLine()
                linhaTexto += ControlChars.CrLf
            End While
            leitor.Close()
            ' Retorna os dados
            Return linhaTexto
        Catch ex As Exception
            Throw ex
        End Try
    End Function
 
    Public Function lerCaracterePorCaractere(ByVal nomeArquivo As String) As String
        ' Retorna um texto do arquivo definido
        Dim caractereTexto As String = ""
        Dim intCaractereTexto As Integer = 0
        ' abre o arquivo e iniciao o objeto StreamReader
        Try
            Dim leitor As StreamReader = File.OpenText(nomeArquivo)
            While leitor.Peek <> -1
                intCaractereTexto = leitor.Read
                'converte o valor inteiro para caractere
                caractereTexto += Chr(intCaractereTexto)
            End While
            leitor.Close()
            ' Retorna os dados
            Return caractereTexto
        Catch ex As Exception
            Throw ex
        End Try
    End Function

End Class


A classe
trataArquivoFuncoes possui 4 métodos:

  1. leTextoDoArquivo(ByVal nomeArquivo As String)

  2. lerLinhaPorLinha(ByVal nomeArquivo As String)

  3. lerCaracterePorCaractere(ByVal nomeArquivo As String)

  4. escreverTextoParaArquivo(ByVal nomeArquivo As String, ByVal Texto As String)

Os 3 métodos de leitura geram o mesmo resultado e somente foram escritos para mostrar os tipos de leituras. Podem contudo tornarem-se úteis com ajustes.

 

Podemos também usar a classe FileStream para criar o arquivo e a seguir usar a classe StreamWriter para escrever no arquivo:

 

Dim fs As FileStream
fs = New FileStream("c:\arquivo.txt", FileMode.CreateNew)

 

Dim sw As StreamWriter
sw = New StreamWriter(fs)
 

 

E como escrever informações binárias ?

 

A classe BinaryWriter funciona de forma idêntica a classe StreamWriter, só que ela trabalha com bytes em formato binário.

 

Desta forma, usando as propriedades da classe FileStream para abrir e criar arquivos, podemos criar os métodos para escrever informações binárias no arquivo e ler a partir de um arquivo da seguinte forma:

 

Public sub salvarParaArquivo (ByVal nomeArquivo As String)

Dim fs As FileStream
fs = New FileStream(nomeArquivo, FileMode.CreateNew)

DIm bw As New BinaryWriter(fs)
bw.Write(objeto)
bw.close()

end sub

 
Public sub carregarDoArquivo (ByVal nomeArquivo As String)

Dim fs As FileStream
fs = New FileStream(nomeArquivo, FileMode.Open)
DIm bw As New BinaryReader(fs)

Dim objeto As New obj()

objeto.Propriedade = bw.ReadString()
bw.close()
End Sub

 

Espero poder continuar com o assunto em um próximo artigo.

 

Até breve...


José Carlos Macoratti