CodeGym /Cursos /C# SELF /Criação e remoção de diretórios (

Criação e remoção de diretórios ( Directory)

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

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
Directory.CreateDirectory(path)
Cria recursivamente todas as pastas do caminho
Checar existência
Directory.Exists(path)
Retorna true ou false
Deletar pasta vazia
Directory.Delete(path)
Lança erro se a pasta não estiver vazia
Deletar pasta com conteúdo
Directory.Delete(path, recursive: true)
Apaga tudo dentro de forma irreversível
Obter lista de arquivos
Directory.GetFiles(path)
Retorna nomes de arquivos
Obter lista de subpastas
Directory.GetDirectories(path)
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);
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION