1. Introdução
Se classes estáticas como File e Directory são como um canivete suíço: sempre à mão, resolvem rápido a tarefa, mas sem ligação a um objeto específico, então FileInfo e DirectoryInfo são ferramentas personalizadas: são criadas para um arquivo ou pasta concretos, "sabem" bastante sobre eles e permitem trabalhar de forma mais prática e flexível, especialmente ao fazer múltiplas operações sobre o mesmo objeto.
Classes de instância guardam detalhes sobre um objeto específico do sistema de arquivos, e depois da primeira leitura das propriedades não é necessário ir de novo ao sistema de arquivos por informação (a não ser que o objeto tenha ficado desatualizado).
- FileInfo — para trabalhar com um arquivo específico.
- DirectoryInfo — para trabalhar com um diretório (pasta) específico.
Elas contêm propriedades e métodos que permitem obter informação detalhada (tamanho, data de criação, extensão, atributos disponíveis) e realizar ações sobre o arquivo/pasta: copiar, apagar, mover etc.
Como são FileInfo e DirectoryInfo
Ambas as classes herdam de uma classe abstrata comum FileSystemInfo, o que permite escrever código que funcione tanto com arquivos quanto com pastas de forma genérica.
System.Object
|
System.MarshalByRefObject
|
System.IO.FileSystemInfo (classe abstrata)
| |
FileInfo DirectoryInfo
Quando usar classes de instância?
- Se você precisa de muita informação sobre um arquivo/pasta (tamanho, data de modificação, extensão, atributos, etc.) e esses dados são usados mais de uma vez.
- Se você quer iterar por todos os arquivos/pastas em um diretório e trabalhar com cada objeto como uma instância "viva".
- Para otimização, quando é importante não ir ao sistema de arquivos desnecessariamente (cache de informação).
- Para um código mais orientado a objetos (backups, biblioteca de mídia, gerenciador de arquivos, etc.).
Como criar uma instância de FileInfo ou DirectoryInfo
using System.IO;
// Cria um objeto FileInfo para um arquivo existente (ou inexistente!):
var fileInfo = new FileInfo("notes.txt");
// Cria um objeto DirectoryInfo para uma pasta:
var dirInfo = new DirectoryInfo(@"C:\Projects");
// Você pode usar caminhos relativos ou absolutos!
Ponto importante: criar um objeto FileInfo ou DirectoryInfo NÃO cria o arquivo/pasta no sistema de arquivos! É só uma descrição (uma referência).
2. Trabalhando com FileInfo
Vamos ver as principais propriedades e métodos dessa classe. Aqui vai um resumo:
| Propriedade/método | O que retorna? | Exemplo de uso |
|---|---|---|
|
Nome do arquivo | |
|
Caminho completo | |
|
Tamanho do arquivo em bytes | |
|
Diretório pai (DirectoryInfo) | |
|
O arquivo existe de fato? | |
|
Extensão do arquivo (.txt) | |
|
Data de criação | |
|
Data da última modificação | |
|
Só de leitura? | |
| Métodos | ||
|
Copiar arquivo | |
|
Apagar arquivo | |
|
Mover arquivo | |
|
Abrir stream para leitura | |
|
Abrir stream para escrita | |
Exemplo: Informação sobre um arquivo
Vamos adicionar um pequeno módulo que obtém informação detalhada sobre um arquivo usando FileInfo.
Console.WriteLine("Digite o nome do arquivo:");
string fileName = Console.ReadLine();
var file = new FileInfo(fileName);
if (file.Exists)
{
Console.WriteLine($"Nome do arquivo: {file.Name}");
Console.WriteLine($"Caminho: {file.FullName}");
Console.WriteLine($"Tamanho: {file.Length} bytes");
Console.WriteLine($"Extensão: {file.Extension}");
Console.WriteLine($"Data de criação: {file.CreationTime}");
Console.WriteLine($"Última modificação: {file.LastWriteTime}");
// Adicional: mostrar o diretório pai
Console.WriteLine($"Pasta pai: {file.DirectoryName}");
}
else
{
Console.WriteLine("Arquivo não encontrado.");
}
Note: não lemos o conteúdo do arquivo, só pegamos metadados.
Prática: Copiar e apagar arquivo
// ... Dentro do método principal, depois de exibir as informações do arquivo com sucesso:
Console.WriteLine("Digite o caminho para a cópia do arquivo:");
string copyPath = Console.ReadLine();
try
{
file.CopyTo(copyPath);
Console.WriteLine($"Arquivo copiado com sucesso para {copyPath}");
}
catch (IOException ex)
{
Console.WriteLine($"Não foi possível copiar o arquivo: {ex.Message}");
}
// Agora vamos apagar a cópia
Console.WriteLine("Apagar a cópia do arquivo? (y/n):");
if (Console.ReadLine().Trim().ToLower() == "y")
{
var copyFile = new FileInfo(copyPath);
if (copyFile.Exists)
{
copyFile.Delete();
Console.WriteLine("Cópia apagada.");
}
}
3. Trabalhando com DirectoryInfo
Vamos ver o que a DirectoryInfo nos oferece:
| Propriedade/método | O que retorna? | Exemplo de uso |
|---|---|---|
|
Nome da pasta | |
|
Caminho completo | |
|
Pasta pai (DirectoryInfo) | |
|
A pasta existe? | |
|
Data de criação | |
|
Data de modificação | |
| Métodos | ||
|
Criar pasta | |
|
Apagar pasta | |
|
Array de arquivos (array de FileInfo) | |
|
Array de subpastas (array de DirectoryInfo) | |
|
Itera arquivos (retorna IEnumerable<FileInfo>, modo adiado) | |
|
Mover pasta | |
Exemplo: Iterando arquivos e pastas
Console.WriteLine("Digite o caminho da pasta:");
string path = Console.ReadLine();
var dir = new DirectoryInfo(path);
if (!dir.Exists)
{
Console.WriteLine("Pasta não encontrada!");
return;
}
Console.WriteLine("\n--- Arquivos ---");
foreach (var file in dir.GetFiles())
{
Console.WriteLine($"{file.Name} ({file.Length} bytes)");
}
Console.WriteLine("\n--- Subpastas ---");
foreach (var subDir in dir.GetDirectories())
{
Console.WriteLine(subDir.Name);
}
4. Nuances úteis
Métodos estáticos vs classes de instância
Quando usar qual abordagem? Se você faz uma ação rápida "one-off" — por exemplo, File.Exists(path) ou File.ReadAllText(path) — métodos estáticos se mostram melhores. Eles são mais simples e um pouco mais rápidos por terem overhead mínimo.
Se você quer obter muita informação sobre um arquivo ou pasta, executar operações repetidas sobre esse objeto, ou simplesmente escrever em estilo OOP — é melhor usar instâncias FileInfo e DirectoryInfo.
Curiosamente, ambas as abordagens usam chamadas de sistema similares "por baixo dos panos". Mas classes de instância fazem cache de algumas propriedades (tamanho, data, atributos), minimizando o número de acessos ao sistema de arquivos — muito útil ao iterar por grandes quantidades de arquivos.
Um pouco sobre data e hora
As propriedades CreationTime, LastWriteTime, LastAccessTime retornam valores do tipo DateTime.
Console.WriteLine($"Arquivo criado: {file.CreationTime:yyyy-MM-dd HH:mm:ss}");
Console.WriteLine($"Última modificação: {file.LastWriteTime:yyyy-MM-dd HH:mm:ss}");
Se o arquivo ou pasta foi alterado no disco depois que você obteve o objeto FileInfo ou DirectoryInfo, a informação em cache pode estar desatualizada. Para atualizar, chame file.Refresh().
Dicas e observações práticas
- Classes de instância são convenientes quando você cria uma camada sobre o sistema de arquivos: backups, biblioteca de mídia, indexador.
- Funcionam bem com LINQ: dá pra filtrar por tamanho, data ou extensão e executar operações nos objetos selecionados.
- Em operações em massa, prefira EnumerateFiles() e EnumerateDirectories() ao invés de GetFiles()/GetDirectories() — a enumeração preguiçosa economiza memória e acelera o início do processamento.
Comparação entre abordagem estática e de instância
| Métodos estáticos | Classes de instância | |
|---|---|---|
| Sintaxe | |
|
| Cache | Não | Sim |
| Muita informação | É preciso chamar muitos métodos | Está no objeto |
| Estilo OOP | Não | Sim |
| Operações em massa | Desconfortável | Confortável |
| Trabalho com streams | Existe | Existe |
Atualizando informação e objetos
Objetos FileInfo/DirectoryInfo fazem cache dos valores após o primeiro acesso às propriedades. Se o objeto (arquivo ou pasta) foi modificado no disco depois da criação da instância, para atualizar a informação chame o método .Refresh().
var file = new FileInfo("notes.txt");
long oldSize = file.Length;
// Nesse meio tempo alguém (ou você) modifica o arquivo fora do programa
file.Refresh();
long newSize = file.Length;
Isso não é tão comum, mas se seu programa observa o sistema de arquivos — o mecanismo é importante.
5. Erros típicos ao trabalhar com classes de instância
Equívoco: se você criou o objeto new FileInfo("file.txt"), isso não significa que o arquivo já existe. Na verdade, não — o arquivo só aparece depois de escrever explicitamente ou chamar Create().
Tentar acessar propriedades de um arquivo que não existe: algumas propriedades retornam valores padrão (por exemplo, tamanho 0), mas tentar abrir um stream de leitura lançará uma exceção.
Com pastas é a mesma coisa: criar DirectoryInfo não garante que a pasta exista no disco até chamar Create() ou que ela apareça de fato.
GO TO FULL VERSION