1. Introdução
Imagine que você está escrevendo um programa onde o usuário faz upload das próprias fotos. É melhor guardar elas não como uma "bagunça" em uma única pasta, mas criar diretórios separados — por data, por nome do usuário, tanto faz. Ou, por exemplo, seu programa gera relatórios: faz sentido colocar os resultados em um diretório dedicado, que também precisa ser criado em tempo de execução. E deletar pastas temporárias depois do trabalho é responsabilidade de um código decente (e livra o usuário do lixo).
Trabalhar com diretórios é uma tarefa comum em muitos aplicativos: desde backups até jogos que querem organizar os saves em pastas. Em entrevistas o assunto também aparece bastante, porque é importante entender não só que existe o comando "criar" ou "deletar", mas como ele se comporta em situações não triviais.
Diretório (ou pasta) é basicamente um contêiner para outros arquivos e diretórios no sistema de arquivos. Diretórios formam uma estrutura em árvore (filesystem tree): cada pasta tem um pai, exceto a raiz, e pode ter pastas filhas — até milhares.
2. Como criar uma pasta? A classe estática Directory
A maneira mais simples de criar uma pasta é usar o método estático Directory.CreateDirectory. Não precisa instanciar nada, só passe o caminho:
using System.IO;
// Criamos a pasta "Reports" no diretório atual
Directory.CreateDirectory("Reports");
Se essa pasta já existe, o método não faz nada e não lança erro — pode chamar CreateDirectory numa boa, sem se preocupar se a pasta já existe.
Vamos tentar um caminho mais complexo, por exemplo criar uma pasta aninhada:
Directory.CreateDirectory(@"Data\Photos\2024\June");
Essa chamada vai criar toda a cadeia de diretórios se alguns diretórios intermediários não existirem. Isso se chama criação recursiva — o Directory.CreateDirectory cuida de tudo sozinho.
Importante! No caminho dos diretórios use ou barra invertida dupla (\\) no Windows, ou barra (/). Melhor ainda — use Path.Combine, que mencionamos antes.
O que CreateDirectory retorna?
O método retorna um objeto do tipo DirectoryInfo. Isso é útil se você já quiser trabalhar com esse diretório:
DirectoryInfo reportsDir = Directory.CreateDirectory("Reports");
Console.WriteLine($"Pasta criada: {reportsDir.FullName}");
Como saber se a pasta existe?
Sempre que quiser operar sobre um diretório, é bom checar se ele existe. Para isso existe o método estático:
bool exists = Directory.Exists("Reports");
if (!exists)
{
Console.WriteLine("Pasta não encontrada, vou criar agora!");
Directory.CreateDirectory("Reports");
}
Dica: Não é obrigatório fazer checagem prévia antes de criar: o método não vai quebrar se a pasta já existir. Mas se você quer mostrar uma mensagem bonitinha pro usuário ou seguir uma lógica diferente, esse jeito é útil.
3. Criação de diretórios: casos práticos
Vamos aplicar isso no nosso app didático. Suponha que registramos entradas de usuários e queremos guardar uma pasta separada para cada um:
// Adicione System.IO no topo do arquivo, se não estiver
using System.IO;
Console.Write("Digite o nome do usuário: ");
string userName = Console.ReadLine() ?? "Unknown";
// Montamos o caminho para a pasta do usuário
string basePath = "UsersData";
string userPath = Path.Combine(basePath, userName);
// Criamos a pasta do usuário (e a pai, se necessário)
Directory.CreateDirectory(userPath);
Console.WriteLine($"Pasta do usuário \"{userName}\" pronta: {Path.GetFullPath(userPath)}");
O exemplo acima vai criar a estrutura de arquivos (se ela não existir):
UsersData/
└── NomeDoUsuario/
Conselho: sempre use Path.Combine quando concatenar pedaços de caminho — assim seu código vai rodar tanto no Windows quanto no Linux/Mac.
4. Como deletar uma pasta? Método Directory.Delete
Deletar uma pasta é quase tão simples quanto criar. Mas tem nuances.
Directory.Delete("Reports");
Se a pasta existe e está vazia — ela é removida sem problemas. Mas se tiver algo dentro, será lançada uma exceção:
System.IO.IOException: "The directory is not empty."
E se eu quiser deletar a pasta com conteúdo?
Existe uma sobrecarga do método — com o parâmetro recursive: true:
Directory.Delete("Reports", recursive: true);
ATENÇÃO: A remoção recursiva apaga tudo dentro da pasta de forma irreversível. Se você passar o caminho errado, pode perder dados importantes. Sempre confira o caminho duas vezes!
Exemplo
Vamos adicionar a opção de deletar a pasta do usuário (por exemplo, quando o usuário exclui a conta):
// Perguntamos se precisa deletar
Console.Write("Deletar a pasta do usuário? (y/n): ");
string input = Console.ReadLine() ?? "";
if (input.ToLower() == "y")
{
if (Directory.Exists(userPath))
{
// Deleta junto com todo o conteúdo
Directory.Delete(userPath, recursive: true);
Console.WriteLine("Pasta do usuário deletada!");
}
else
{
Console.WriteLine("A pasta já não existe.");
}
}
5. Tabela: Métodos principais para trabalhar com pastas
| Operação | Método | Particularidades |
|---|---|---|
| Criar pasta | |
Cria recursivamente todas as pastas do caminho |
| Checar existência | |
Retorna true ou false |
| Deletar pasta vazia | |
Lança erro se a pasta não estiver vazia |
| Deletar pasta com conteúdo | |
Apaga tudo dentro de forma irreversível |
| Obter lista de arquivos | |
Retorna nomes de arquivos |
| Obter lista de subpastas | |
Retorna nomes de diretórios |
6. Pontos não óbvios e erros típicos
Erro ao criar: sem permissão ou caminho inválido
Se você tentar criar pasta em diretórios do sistema (por exemplo, "C:\Windows\System32\SuperApp"), provavelmente vai receber UnauthorizedAccessException ou IOException.
Dicas práticas:
Sempre trate erros com try-catch quando estiver mexendo com pastas externas (tipo pendrive do usuário ou um drive de rede).
Não confie cegamente em caminhos fornecidos pelo usuário.
try
{
Directory.CreateDirectory(pathFromUser);
}
catch (Exception ex)
{
Console.WriteLine($"Não foi possível criar a pasta: {ex.Message}");
}
Deletar pasta em uso por outro processo
Se alguém (ou o próprio programa) abriu um arquivo dentro da pasta e manteve ele aberto, ao tentar deletar a pasta você vai receber IOException — "não é possível deletar, a pasta está em uso". Primeiro feche todos os arquivos dentro da pasta.
Pasta não está vazia e você esqueceu o recursive: true
Problema muito comum. Se não passar recursive: true e a pasta não estiver vazia — vai dar exceção.
Use caminhos absolutos para operações críticas
Trabalhar com caminhos relativos ("Reports") sempre é relativo ao diretório de trabalho atual da aplicação. Se o programa for executado de outro lugar, a pasta será criada em outro lugar do que você espera. Verifique de onde seu código está sendo executado, ou passe logo o caminho completo:
string fullPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "MyAppData");
Directory.CreateDirectory(fullPath);
GO TO FULL VERSION