C# Ler arquivos de texto – 01

Resumo : neste tutorial, você aprenderá várias técnicas para ler arquivos de texto em C# usando File.ReadAllText(), File.ReadAllTextAsync(), File.ReadAllLines(), File.ReadAllLinesAsync()método e FileStreamclasse.

C# fornece várias maneiras de permitir a leitura eficaz de arquivos de texto. Criaremos um readme.txtarquivo no C:\temp\diretório da demonstração.

O readme.txtarquivo possui duas linhas:

Hello
ByeLinguagem de código:  C#  ( cs )

Lendo um arquivo de texto em uma string

Se um arquivo de texto for pequeno, você poderá ler todo o conteúdo do arquivo em uma string usando o File.ReadAllText() método estático :

public static string ReadAllText(string path);Linguagem de código:  C#  ( cs )

O File.ReadAllText()método abre um arquivo de texto, lê todo o texto do arquivo em uma string e depois fecha o arquivo.

Por exemplo, o programa a seguir usa o File.ReadAllText()método para ler o conteúdo do readme.txtarquivo e gravar o texto no console:

string contents = File.ReadAllText(@"C:\temp\readme.txt");
Console.WriteLine(contents);Linguagem de código:  C#  ( cs )

Se o arquivo não for encontrado, File.ReadAllText()gera um arquivo FileNotFoundException. Por exemplo, o programa a seguir tenta ler um arquivo readme1.txtdo C:\temp\diretório, que não existe e manipula FileNotFoundException:

try
{
    string contents = File.ReadAllText(@"C:\temp\readme1.txt");
    Console.WriteLine(contents);
}
catch (FileNotFoundException e)
{
    Console.WriteLine(e.Message);
}Linguagem de código:  C#  ( cs )

Saída:

Could not find file 'C:\temp\readme1.txt'.Linguagem de código:  C#  ( cs )

Lendo um arquivo de texto em uma matriz de string

Se quiser processar um pequeno arquivo de texto linha por linha, você pode ler seu conteúdo em uma matriz de strings, onde cada elemento da matriz armazena uma linha no arquivo de texto.

Para ler o conteúdo de um arquivo de texto em um array de strings, você usa o File.ReadAllLines()método:

public static string[] ReadAllLines (string path);Linguagem de código:  C#  ( cs )

Por exemplo:

string[] lines = File.ReadAllLines(@"C:\temp\readme.txt");
foreach (var line in lines)
{
    Console.WriteLine(line.ToUpperInvariant());
}Linguagem de código:  C#  ( cs )

Saída:

HELLO
BYELinguagem de código:  C#  ( cs )

Lendo um arquivo de texto grande linha por linha

Se um arquivo de texto for grande, a leitura de todo o arquivo de texto em uma sequência ou matriz de sequências não terá otimização de memória.

Nesse caso, você pode ler o conteúdo de um arquivo de texto usando um fluxo e processar o conteúdo linha por linha.

Um fluxo representa um fluxo de dados que você pode ler. Para ler dados de um arquivo, você pode criar um FileStreame usar um StreamReaderpara ler dados do arquivo FileStream.

Aqui estão as etapas:

Primeiro, crie um FileStreamcom o FileMode.Open usando a FileStreamclasse:

using var fs = new FileStream(path, FileMode.Open);Linguagem de código:  C#  ( cs )

Segundo, crie um novo StreamReaderpara ler o conteúdo de FileStream:

using var reader = new StreamReader(fs);Linguagem de código:  C#  ( cs )

Terceiro, leia a linha do início StreamReaderao fim do fluxo. Para verificar se o programa chega ao final do stream, você usa a reader.EndOfStreampropriedade. Para ler uma linha de a StreamReader, você usa o ReadLine()método.

O programa a seguir demonstra como ler o conteúdo readme.txtlinha por linha usando a FileStreame StreamReader:

using static System.Console;

using var fs = new FileStream(@"C:\temp\readme.txt", FileMode.Open);
using var reader = new StreamReader(fs);

while (!reader.EndOfStream)
{
    var line = reader.ReadLine();
    WriteLine(line?.ToUpperInvariant());
}Linguagem de código:  C#  ( cs )

Saída:

HELLO
BYELinguagem de código:  C#  ( cs )

O programa funciona bem, mas o código parece bastante detalhado. Para torná-lo mais conciso, você pode usar o File.OpenText()método estático.

O File.OpenText()método aceita um caminho e retorna uma nova instância da StreamReaderclasse. Aqui está a versão revisada do programa acima:

using static System.Console;

using var reader = File.OpenText(@"C:\temp\readme.txt");

while (!reader.EndOfStream)
{
    var line = reader.ReadLine();
    WriteLine(line?.ToUpperInvariant());
}Linguagem de código:  C#  ( cs )

Então essas duas linhas:

using var fs = new FileStream(@"C:\temp\readme.txt", FileMode.Open);
using var reader = new StreamReader(fs);Linguagem de código:  C#  ( cs )

torne-se um:

using var reader = File.OpenText(@"C:\temp\readme.txt");Linguagem de código:  C#  ( cs )

Leia todo o texto em uma string de forma assíncrona

Para ler todo o conteúdo de um arquivo de texto em uma string de forma assíncrona, você usa o File.ReadAllTextAsync()método:

public static Task<string> ReadAllTextAsync (
    string path, 
    CancellationToken cancellationToken = default
);Linguagem de código:  C#  ( cs )

Por exemplo:

using static System.Console;

var text = await File.ReadAllTextAsync(@"C:\temp\readme.txt");
WriteLine(text);Linguagem de código:  C#  ( cs )

Saída:

Hello
ByeLinguagem de código:  C#  ( cs )

Como o File.ReadAllTextAsync()método retorna a Task<String>, você precisa usar awaita palavra-chave para aguardar a conclusão da tarefa e obter o resultado da string.

Da mesma forma, você pode ler todas as linhas de um arquivo de texto em uma matriz de strings de forma assíncrona usando o File.ReadAllLineAsync()método estático:

public static Task<string[]> ReadAllLinesAsync (
   string path,
   CancellationToken cancellationToken = default
);Linguagem de código:  C#  ( cs )

Por exemplo:

using static System.Console;

var lines = await File.ReadAllLinesAsync(@"C:\temp\readme.txt");
foreach (var line in lines)
{
    WriteLine(line);
}Linguagem de código:  C#  ( cs )

Lendo um arquivo de texto com uma codificação especificada

Por padrão, cada um dos métodos ReadAllText, ReadAllLines, ReadAllTextAsynce ReadAllLineAsynctem uma sobrecarga que permite especificar a codificação aplicada ao texto do arquivo:

public static string ReadAllText (string path, Encoding encoding);
public static string[] ReadAllLines (string path, Encoding encoding);
public static Task<string> ReadAllTextAsync (string path, Encoding encoding, CancellationToken cancellationToken = default);
public static Task<string[]> ReadAllLinesAsync(string path, Encoding encoding, CancellationToken cancellationToken = default);Linguagem de código:  C#  ( cs )

Nesta sintaxe, a Encodingclasse pertence ao System.Textnamespace.

Resumo

  • Use o File.ReadAllText()método para ler o conteúdo de um pequeno arquivo de texto em uma string.
  • Use o File.ReadAllLines()método para ler o conteúdo de um pequeno arquivo de texto em uma matriz de strings.
  • Use o File.ReadAllTextAsync()método para ler o conteúdo de um pequeno arquivo de texto em uma string de forma assíncrona.
  • Use o File.ReadAllLinesAsync()método para ler todas as linhas de um arquivo de texto em uma matriz de strings de forma assíncrona.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *