Por que saber trabalhar com arquivos em C# é um superpoder?
\n\nImagine que você está escrevendo um programa que precisa salvar configurações do usuário, registrar erros ou processar milhares de documentos. Sem habilidades de trabalho com o sistema de arquivos, você vai bater em uma parede. Em C#, trabalhar com arquivos não é apenas uma leitura chata de linhas. É a oportunidade de criar utilitários poderosos, parsers e até minibancos de dados.
\n\nNeste artigo, vamos abordar tudo: desde o básico File.ReadAllText até o trabalho avançado com streams e pastas. Você aprenderá como não perder dados, como otimizar a leitura de arquivos grandes e como contornar as "armadilhas" do sistema de arquivos. Vamos lá!
Classes-heróis: File, FileInfo, Directory e Path
\n\nNo .NET, existem duas abordagens para trabalhar com arquivos: os métodos estáticos da classe File e os métodos de instância da classe FileInfo. O primeiro é para operações rápidas do tipo "leu-escreveu", o segundo é quando você precisa trabalhar com um único arquivo por muito tempo e mantendo o estado.
File vs FileInfo: quando usar o quê?
\n\nFile é uma classe estática. Você escreve File.Exists("test.txt") e pronto. Conveniente, mas a cada operação o sistema verifica o caminho novamente.
FileInfo — você cria o objeto uma vez e depois chama os métodos. É mais rápido se você fizer várias ações com o mesmo arquivo.
\n\n// Maneira rápida\nif (File.Exists(@"C:\\data\\log.txt"))\n{\n string content = File.ReadAllText(@"C:\\data\\log.txt");\n Console.WriteLine(content);\n}\n\n// Maneira profissional\nFileInfo fileInfo = new FileInfo(@"C:\\data\\log.txt");\nif (fileInfo.Exists)\n{\n using (StreamReader reader = fileInfo.OpenText())\n {\n string content = reader.ReadToEnd();\n Console.WriteLine(content);\n }\n}\n\n\nA classe Directory funciona pelo mesmo princípio — métodos estáticos para operações rápidas com pastas. Path é um auxiliar indispensável para concatenar caminhos: Path.Combine("pasta", "arquivo.txt") coloca automaticamente a barra correta.
Leitura de arquivos: do pequeno ao gigante
\n\nA leitura de arquivos em C# é uma arte de equilíbrio entre simplicidade e desempenho. Vamos analisar três níveis.
\n\nNível 1: Tudo de uma vez (para arquivos pequenos)
\n\nSe o arquivo tem até 10 MB, use ReadAllText ou ReadAllLines sem medo.
string text = File.ReadAllText("config.json");\nstring[] lines = File.ReadAllLines("users.csv");\n\n\nDesvantagem: com um arquivo grande, você corre o risco de obter OutOfMemoryException.
Nível 2: Leitura linha por linha (para arquivos médios)
\n\nUsamos StreamReader — lemos linha por linha, sem carregar tudo na memória.
using (StreamReader reader = new StreamReader("big_log.txt"))\n{\n string line;\n while ((line = reader.ReadLine()) != null)\n {\n Console.WriteLine(line); // Processamos cada linha\n }\n}\n\n\nObserve o using — ele garante que o arquivo será fechado, mesmo que ocorra um erro.
Nível 3: Leitura de dados binários (para profissionais)
\n\nTrabalhar com imagens, arquivos compactados ou qualquer arquivo não textual requer FileStream.
using (FileStream fs = new FileStream("photo.jpg", FileMode.Open, FileAccess.Read))\n{\n byte[] buffer = new byte[1024];\n int bytesRead;\n while ((bytesRead = fs.Read(buffer, 0, buffer.Length)) > 0)\n {\n // Processamos o bloco de dados\n Console.WriteLine($"Lidos {bytesRead} bytes");\n }\n}\n\n\nEscrita de arquivos: como não perder dados
\n\nEscrever em C# não é apenas File.WriteAllText. É importante entender os modos: criar um novo arquivo, anexar ao final ou sobrescrever.
Modos principais do FileMode
\n- \n
- CreateNew<