Visual Basic em Português

Página pessoal de Jorge Paulino sobre o Visual Basic (VB.NET, ASP.NET, VB6, VBA) e algumas noticias de tecnologia

VB.NET: Utilização de Ficheiros de Texto

A utilização e manipulação de ficheiros de texto (*. txt ou outra extensão) é muito comum embora existam bastantes alternativas disponíveis para guardar informação. No entanto, muitas vezes não é uma questão de alternativa (usar ou não usar) mas sim uma necessidade.

O .NET Framework 2.0 introduziu novos métodos que possibilitam um fácil e rápido acesso. Os métodos mais utilizados e mais eficazes para ler e escrever em ficheiros de texto são os namespaces IO (através da classe File, principalmente ReadAllLines, WriteAllText e AppendAllText e o StreamReader, StreamWriter) e o My (através da classe My.Computer.FileSystem, principalmente ReadAllText e WriteAllText).

Obviamente que existem diferenças entre eles, mas as principais diferenças são que o StreamReader e StreamWriter lê/escreve linha a linha e os outros métodos lêem/escrevem tudo de uma só vez, ou seja, utilizam mais recursos da aplicação. Por exemplo o StreamReader lê linha a linha enquanto o método ReadAllLines lê toda a informação para uma variável (array).

É claro que isto apenas se consegue notar em grande número de informação, mas para verem as principais diferenças e desempenhos vejam a seguinte tabela com os tempos de acesso em milisegundos.

Tempo Médio de Leitura

Método/Nº Linhas

10.000

100.000

1.000.000

IO.File.ReadAllLines

4,0

71,2

957,1

IO.StreamReader

2,6

33,9

313,1

My.Computer.FileSystem.ReadAllText

6,7

60,5

991,2

Tempo Médio de Leitura

Método/Nº Linhas

10.000

100.000

1.000.000

IO.File.WriteAllText

15,1

123,8

1.426,4

IO.StreamWriter

13,8

115,5

1.922,8

My.Computer.FileSystem.WriteAllText

15,3

116,8

1.389,1

Nota: Tempo em milisegundos com a média de 10 leitura e texto por linha de 13 caracteres

Para mostrar um pouco a utilização dos diferentes métodos serão mostrados dois exemplos da leitura e escrita. Como o IO.File e o My.Computer.FileSystem são bastante semelhantes, onde a principal diferença é que a classe IO.File tem um método que lê todas as linhas sem necessitar de utilizar uma função de Split() para as colocar num array, irá ser mostrado apenas este. O My.Computer.FileSystem tem ainda um parametro adicionar que permite adicionar, ou não, texto a um arquivo já existente (append).

Exemplo de leitura de um ficheiro através do classe IO.File (ReadAllLines)

        Dim total As Integer = 0
        Dim fileName As String = "c:\teste.txt"

        ' Guarda num Array linha a linha
        Dim lines() As String = IO.File.ReadAllLines(fileName)

        ' Ciclo que irá mostrar linha a linha
        For Each line As String In lines

            Debug.WriteLine(line.ToString)
            total += 1

        Next

        ' Mostra o total de linha lidas
        Debug.WriteLine("Total de linhas:" & total.ToString)

Exemplo de escrita de um ficheiro através do classe IO.File (WriteAllText)

        Dim total As Integer = 0
        Dim fileName As String = "c:\teste.txt"

        ' Cria um novo StringBuilder
        Dim sb As New System.Text.StringBuilder                                   

        ' Ciclo que irá inserir construir o ficheiro a gravar
        For x As Integer = 0 To 9999

            ' Cria uma linha com o formato "Linha nº 0001"
            sb.AppendLine("Linha nº " & x.ToString.PadLeft(4, "0"))
            total += 1
        Next

        ' Grava o ficheiro no disco
        IO.File.WriteAllText(fileName, sb.ToString)

        ' Mostra o resultado
   Debug.WriteLine(String.Format("Ficheiro {0} com {1} registos", fileName, total))

Exemplo de leitura de um ficheiro através do classe IO (StreamReader)

        Dim total As Integer = 0
        Dim fileName As String = "c:\teste.txt"

        ' Ciclo que irá mostrar linha a linha
        Using reader As New IO.StreamReader(fileName)

            ' Ciclo até ao fim do ficheiro
            While Not reader.EndOfStream()

                ' Mostra o resultado linha a linha
                Dim input As String = reader.ReadLine()
                Debug.WriteLine(input)
                total += 1                                   

            End While                                   

        End Using

        ' Mostra o total de linha lidas
        Debug.WriteLine("Total de linhas:" & total.ToString)

Exemplo de escrita de um ficheiro através do classe IO (StreamWriter)

        Dim total As Integer = 0
        Dim fileName As String = "c:\teste.txt"                                   

        ' Cria um nova instância de um StreamWriter
        Using writer As New IO.StreamWriter(fileName)

            ' Inicia o ciclo que irá gravar no ficheiro
            For x As Integer = 0 To 9999

                writer.WriteLine("Linha nº " & x.ToString.PadLeft(4, "0"))
                total += 1

            Next

        End Using

        ' Mostra o resultado
   Debug.WriteLine(String.Format("Ficheiro {0} com {1} registos", fileName, total))

Estes são pequenos exemplos da estrutura tipo, embora existam ainda em cada classe, uma serie de métodos que podem ser utilizados. Pelos exemplos mostrados e pelo desempenho de cada um, deverá ser utilizado aquele que mais se ajustar a cada situação. Apenas em ficheiros grandes deverá haver um mais cuidado na escolha do método a utilizar.

Todos utilizam por defeito uma codificação de UTF-8 mas por vezes é necessário ajustar para certos ficheiros. A opção System.Text.Encoding.Default é muitas vezes a melhor solução para problemas de codificação.

                                

PS: Como sempre, qualquer dúvida, comentário ou correcção ao artigo é sempre bem vinda!

4 comentários:

Absinthe disse...

Tens aqui muito bom material ! Tem sido uma belíssima ajuda ^^ parabéns !

Jomi disse...

Muito bem

claudia disse...

Boa noite,

Estou a fazer um trabalho importante sobre o visual basic 6 e apenas me falta incluir a manipulação de ficheiros em vb6, mas nao percebo em que e que consiste e desconheço a sua sintaxe. Podia ajudar-me?

Obrigada

Jorge Paulino disse...

Olá Claudia!

Este sintaxe é para VB.NET e não para VB6. Coloque a sua dúvida em aqui

Mensagens Recentes



Microsoft Office Especialist

Membro da Comunidade
Experts-Exchange


Administ. da Comunidade
Portugal-a-Programar



Twitter

Artigos no CodeProject

Artigos no CodeProject

Subscrever Novidades

Endereço de Email:

Delivered by FeedBurner

Seguidores

Histórico