Resumo : neste tutorial, você aprenderá várias técnicas para ler arquivos de texto em C# usando
, File.ReadAllText
()
, File.ReadAllText
Async()
, File.ReadAllLines
()
método e File.ReadAllLines
Async()FileStream
classe.
C# fornece várias maneiras de permitir a leitura eficaz de arquivos de texto. Criaremos um readme.txt
arquivo no C:\temp\
diretório da demonstração.
O readme.txt
arquivo possui duas linhas:
Hello
Bye
Linguagem 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
método estático :File.ReadAllText
()
public static string ReadAllText(string path);
Linguagem de código: C# ( cs )
O
método abre um arquivo de texto, lê todo o texto do arquivo em uma string e depois fecha o arquivo.File.ReadAllText
()
Por exemplo, o programa a seguir usa o
método para ler o conteúdo do File.ReadAllText
()readme.txt
arquivo 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,
gera um arquivo File.ReadAllText
()
. Por exemplo, o programa a seguir tenta ler um arquivo FileNotFoundException
readme1.txt
do 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
método:File.ReadAllLines
()
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
BYE
Linguagem 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 FileStream
e usar um StreamReader
para ler dados do arquivo FileStream
.
Aqui estão as etapas:
Primeiro, crie um
com o FileStream
FileMode
.Open usando a
classe:FileStream
using var fs = new FileStream(path, FileMode.Open);
Linguagem de código: C# ( cs )
Segundo, crie um novo StreamReader
para 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
ao fim do fluxo. Para verificar se o programa chega ao final do stream, você usa a StreamReader
reader.EndOfStream
propriedade. Para ler uma linha de a
, você usa o StreamReader
ReadLine()
método.
O programa a seguir demonstra como ler o conteúdo readme.txt
linha por linha usando a FileStream
e 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
BYE
Linguagem 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
método estático.File.OpenText
()
O
método aceita um caminho e retorna uma nova instância da File.OpenText
()StreamReader
classe. 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
método:File.ReadAllTextAsync
()
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
Bye
Linguagem de código: C# ( cs )
Como o
método retorna a File.ReadAllTextAsync
()Task<String>
, você precisa usar await
a 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
método estático:File.ReadAllLineAsync
()
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
, ReadAllTextAsync
e ReadAllLineAsync
tem 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 Encoding
classe pertence ao System.Text
namespace.
Resumo
- Use o
método para ler o conteúdo de um pequeno arquivo de texto em uma string.File.ReadAllText
() - Use o
método para ler o conteúdo de um pequeno arquivo de texto em uma matriz de strings.File.ReadAllLines
() - Use o
método para ler o conteúdo de um pequeno arquivo de texto em uma string de forma assíncrona.File.ReadAllTextAsync
() - Use o
método para ler todas as linhas de um arquivo de texto em uma matriz de strings de forma assíncrona.File.ReadAllLinesAsync
()