CodeGym /Cursos /C# SELF /Verificando existência de arquivo/pasta

Verificando existência de arquivo/pasta

C# SELF
Nível 38 , Lição 2
Disponível

1. Introdução

Por que é importante checar se o arquivo ou pasta existe?

Imagine que você escreve um diário, e no seu app tem a opção de adicionar uma entrada no fim do arquivo. Tudo funciona bem enquanto o arquivo existe. Mas se o arquivo for removido por engano, o programa vai lançar erro, e todas as suas ideias geniais sobre o sentido da vida ou, no pior dos casos, sobre o tempo, vão desaparecer sem deixar rastro. Do mesmo jeito, se você quer criar um arquivo novo para não perder nada, vale confirmar que esse arquivo ainda não existe.

Em apps reais — especialmente em desenvolvimento corporativo e industrial — checar previamente a existência de arquivos e pastas evita não só erros por parte do usuário e falhas críticas, mas também economiza muito tempo e esforço da equipe e, o que não é menos importante, livra todo mundo de dor de cabeça desnecessária.

Trabalhando com o sistema de arquivos no .NET

Na plataforma .NET, para trabalhar com arquivos e pastas vamos usar as seguintes classes principais (elas ficam no namespace System.IO):

  • File — métodos estáticos para trabalhar com arquivos: checagens, copiar, deletar etc.
  • Directory — métodos estáticos para trabalhar com pastas.

Para checar existência bastam dois métodos:

  • File.Exists(path) — retorna true se o arquivo existir.
  • Directory.Exists(path) — retorna true se a pasta existir.

2. Checando o arquivo antes de abrir

Exemplo do dia a dia

Suponha que você adicionou uma função para mostrar o conteúdo do diário:

string diaryPath = "diary.txt";
        
if (File.Exists(diaryPath))
{
    // O arquivo existe, lemos e exibimos o conteúdo
    using var reader = new StreamReader(diaryPath);
    string content = reader.ReadToEnd();
    Console.WriteLine("Seu diário:\n" + content);
}
else
{
    Console.WriteLine("Arquivo do diário não encontrado!");
    // Dá para criar um novo arquivo imediatamente, se for necessário
    File.WriteAllText(diaryPath, "Este é o começo do seu diário.\n");
    Console.WriteLine("Criado novo arquivo de diário.");
}

Em projetos reais essa abordagem é must-have: você não fica esperando por "milagres", você controla a situação.

3. Checando o arquivo antes de escrever

Cenário: o app gera relatórios por agendamento. É preciso garantir que cada relatório novo não sobrescreva o anterior.

Para isso é útil checar: e se o arquivo já existir? Se existir — por exemplo, pedir ao usuário outro nome ou criar um arquivo com nome único.

string reportPath = "report.txt";
        
if (File.Exists(reportPath))
{
    Console.WriteLine($"O arquivo '{reportPath}' já existe. Renomeie ou deletar o arquivo antigo.");
}
else
{
    using var writer = new StreamWriter(reportPath);
    writer.WriteLine("Este é o novo relatório de hoje!");
    Console.WriteLine("Arquivo de relatório criado com sucesso.");
}

Essa checagem vai poupar seus usuários (e você mesmo!) de surpresas desagradáveis como arquivos sobrescritos.

4. Checando a pasta antes de escrever

Arquivos raramente ficam diretamente na raiz do projeto. Frequentemente eles são colocados em diretórios específicos: logs/, reports/, data/ etc. Antes de gravar um arquivo vale confirmar que a pasta necessária existe.

string logsDir = "logs";
string logPath = Path.Combine(logsDir, "log.txt"); // Path.Combine ajuda a juntar partes do caminho de forma segura
        
if (!Directory.Exists(logsDir))
{
    Console.WriteLine("Pasta 'logs' não encontrada. Criando...");
    Directory.CreateDirectory(logsDir);
}

using var writer = new StreamWriter(logPath, append: true);
writer.WriteLine($"[{DateTime.Now}] Aplicação iniciada.");
Console.WriteLine("Registro no arquivo de log realizado com sucesso.");

Aliás, o método Directory.CreateDirectory não vai lançar erro se a pasta já existir — ele apenas ignora — então você pode pular a checagem se esse estilo te agrada.

5. Nuances importantes

Detalhes: caminhos relativos e absolutos

Um erro comum de iniciantes é confundir caminhos relativos e absolutos. Por exemplo, se você chama File.Exists("data.txt"), o programa procura o arquivo na pasta de trabalho atual. E onde é isso? Depende de onde a aplicação foi iniciada.

Para ser mais confiável use caminhos absolutos ou construa o caminho com Path.Combine:

string myDocs = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
string filePath = Path.Combine(myDocs, "myapp", "settings.txt");

O caminho fica sempre explícito e você não perde o arquivo de vista.

Detalhes importantes da checagem

  • Às vezes fazem a checagem, mas logo em seguida executam ações repetidas sobre o mesmo arquivo/pasta. Entre File.Exists e a criação/deleção subsequente pode acontecer um intervalo de tempo, e outro processo pode alterar o estado. Em cenários críticos adicione tratamento de erros com try-catch.
  • Cheque não só a existência, mas também permissões de acesso. Às vezes o arquivo existe, mas o usuário não tem permissão sobre ele.
  • Para diretórios use Directory.Exists, não File.Exists — caso contrário você sempre vai receber false.
  • Se o caminho contém várias pastas aninhadas, por exemplo "data/2024/04", então Directory.CreateDirectory("data/2024/04") vai criar toda a cadeia — isso é conveniente e evita checagens extras.

E se não checar?

Se você tentar abrir um arquivo inexistente para leitura — vai receber FileNotFoundException. Se tentar criar um arquivo em uma pasta inexistente — DirectoryNotFoundException. Se o programa roda sob um usuário comum, ele vai ver o erro e ficar irritado. Em ambiente produtivo — você perde dados/dinheiro/tempo. Então "checar se existe" não é frescura, é cuidado com o usuário (e com sua própria sanidade).

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