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:
leTextoDoArquivo(ByVal nomeArquivo As String)
lerLinhaPorLinha(ByVal nomeArquivo As String)
lerCaracterePorCaractere(ByVal nomeArquivo As String)
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
Dim sw As
StreamWriter |
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() |
Espero poder continuar com o assunto em um próximo artigo.
Até breve...
José Carlos Macoratti