Trabalho com o sistema de arquivos em C#: da teoria à prática
Trabalhar com o sistema de arquivos é uma das tarefas básicas que todo desenvolvedor enfrenta. Seja para registro de logs, processamento de arquivos de configuração, importação de dados ou criação de relatórios — saber ler, escrever e gerenciar arquivos corretamente em C# (.NET) é essencial em qualquer projeto. Neste artigo, vamos explorar exemplos práticos de trabalho com o sistema de arquivos em C#, começando por operações simples até o processamento de diretórios.
Usaremos o namespace System.IO, que fornece todas as classes necessárias para interagir com o sistema de arquivos.
1. Principais classes para trabalhar com arquivos e pastas
Antes de escrever código, é importante conhecer as principais classes:
- File — classe estática para criar, copiar, excluir e mover arquivos.
- FileInfo — classe de instância que fornece informações sobre um arquivo específico e métodos para trabalhar com ele.
- Directory — classe estática para trabalhar com pastas.
- DirectoryInfo — classe de instância para obter informações sobre uma pasta.
- Path — classe utilitária para trabalhar com caminhos de arquivos.
Vamos ver um exemplo simples — verificar se um arquivo existe e criá-lo:
using System;using System.IO;
class Program{ static void Main() { string filePath = @"C:\\Test\\example.txt";
if (File.Exists(filePath)) { Console.WriteLine("O arquivo existe."); } else { File.Create(filePath).Close(); Console.WriteLine("Arquivo criado."); } }}Observe: após File.Create(), chamamos Close() para liberar o fluxo. Em projetos modernos, é melhor usar a construção using.
2. Leitura e escrita de arquivos de texto
O cenário mais comum é a leitura e escrita de informações textuais. Em C#, existem as classes convenientes StreamReader e StreamWriter.
2.1 Escrevendo dados em um arquivo
Exemplo de escrita de linhas em um arquivo usando StreamWriter:
string path = @"C:\\Test\\log.txt";string[] lines = { "Primeira linha", "Segunda linha", "Terceira linha" };
using (StreamWriter writer = new StreamWriter(path, false)){ foreach (string line in lines) { writer.WriteLine(line); }}Console.WriteLine("Dados gravados.");O segundo parâmetro do construtor StreamWriter — false — significa sobrescrever o arquivo. Se for true, os dados serão adicionados ao final.
2.2 Lendo dados de um arquivo
Leitura de todo o conteúdo ou linha por linha:
string path = @"C:\\Test\\log.txt";
// Leitura de todo o texto em uma única stringstring allText = File.ReadAllText(path);Console.WriteLine("Texto completo:" + allText);
// Leitura linha por linhastring[] allLines = File.ReadAllLines(path);Console.WriteLine("Linha por linha:");foreach (string line in allLines){ Console.WriteLine(line);}Para arquivos grandes, é melhor usar StreamReader com leitura linha por linha em um loop, para não carregar todo o arquivo na memória.
using (StreamReader reader = new StreamReader(path)){ string currentLine; while ((currentLine = reader.ReadLine()) != null) { Console.WriteLine(currentLine); }}3. Trabalhando com arquivos binários (FileStream)
Quando é necessário trabalhar com dados binários (imagens, arquivos compactados, objetos serializados), usa-se a classe FileStream. Ela permite ler e gravar dados na forma de bytes.
Exemplo de gravação e leitura de um array de bytes: