CodeGym /Cursos /C# SELF /Classes de instância FileI...

Classes de instância FileInfo e DirectoryInfo

C# SELF
Nível 39 , Lição 1
Disponível

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
Name
Nome do arquivo
fileInfo.Name
FullName
Caminho completo
fileInfo.FullName
Length
Tamanho do arquivo em bytes
fileInfo.Length
Directory
Diretório pai (DirectoryInfo)
fileInfo.Directory.FullName
Exists
O arquivo existe de fato?
fileInfo.Exists
Extension
Extensão do arquivo (.txt)
fileInfo.Extension
CreationTime
Data de criação
fileInfo.CreationTime
LastWriteTime
Data da última modificação
fileInfo.LastWriteTime
IsReadOnly
Só de leitura?
fileInfo.IsReadOnly
Métodos
CopyTo()
Copiar arquivo
fileInfo.CopyTo("copy.txt")
Delete()
Apagar arquivo
fileInfo.Delete()
MoveTo()
Mover arquivo
fileInfo.MoveTo("move.txt")
OpenRead()
Abrir stream para leitura
using var stream = fileInfo.OpenRead()
OpenWrite()
Abrir stream para escrita
using var stream = fileInfo.OpenWrite()

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
Name
Nome da pasta
dirInfo.Name
FullName
Caminho completo
dirInfo.FullName
Parent
Pasta pai (DirectoryInfo)
dirInfo.Parent.FullName
Exists
A pasta existe?
dirInfo.Exists
CreationTime
Data de criação
dirInfo.CreationTime
LastWriteTime
Data de modificação
dirInfo.LastWriteTime
Métodos
Create()
Criar pasta
dirInfo.Create()
Delete()
Apagar pasta
dirInfo.Delete()
GetFiles()
Array de arquivos (array de FileInfo)
dirInfo.GetFiles()
GetDirectories()
Array de subpastas (array de DirectoryInfo)
dirInfo.GetDirectories()
EnumerateFiles()
Itera arquivos (retorna IEnumerable<FileInfo>, modo adiado)
dirInfo.EnumerateFiles()
MoveTo()
Mover pasta
dirInfo.MoveTo("path")

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
File.Delete(path)
new FileInfo(path).Delete()
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.

Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION