Como excluir um arquivo depois de verificar se ele existe

220

Como posso excluir um arquivo em C # C:\test.txt, por exemplo , embora aplique o mesmo tipo de método como nos arquivos em lote, por exemplo

if exist "C:\test.txt"

delete "C:\test.txt"

else 

return nothing (ignore)
Tom
fonte

Respostas:

388

Isso é bastante simples usando a classe File .

if(File.Exists(@"C:\test.txt"))
{
    File.Delete(@"C:\test.txt");
}


Como Chris apontou nos comentários, você realmente não precisa fazer a File.Existsverificação, pois File.Deletenão gera uma exceção se o arquivo não existir, embora se você estiver usando caminhos absolutos, precisará da verificação para garantir que o arquivo o caminho completo do arquivo é válido.

Adam Lear
fonte
13
Esse teste não é realmente necessário. Veja meu post.
precisa
20
O teste é necessário se você deseja impedir uma possível DirectoryNotFoundException.
Timothy Strimple
7
O teste não deve ser usado no lugar da exceção, mas sim na condução com ele. Qualquer número de cenários pode resultar na verificação existente retornando true e lançamento de Delete.
Josh
1
Por que existe um @antes do caminho do arquivo? Para mim, funciona sem.
Pascal Ackermann
5
@ evita que você precise dobrar as barras invertidas.
PRMan 21/02
105

Use System.IO.File.Delete assim:

System.IO.File.Delete(@"C:\test.txt")

A partir da documentação:

Se o arquivo a ser excluído não existir, nenhuma exceção será lançada.

Chris Eberle
fonte
7
Isso lançará um DirectoryNotFoundException se "O caminho especificado for inválido (por exemplo, está em uma unidade não mapeada)".
Timothy Strimple
5
Que estranho. Diz Intellisense An exception is thrown if the specified file does not exist.
Fearofawhackplanet
Talvez você esteja usando uma versão diferente da estrutura .NET.
Chris Eberle
1
Estou usando .Net4, parece que o intellisense está errado Tenho executar uma verificação e nenhuma exceção é lançada
fearofawhackplanet
3
Sim, eu tentei e basta System.IO.File.Delete(@"C:\test.txt");. Obrigado
Berkay Turancı
33

Você pode importar o System.IOespaço para nome usando:

using System.IO;

Se o caminho do arquivo representar o caminho completo para o arquivo, você poderá verificar sua existência e excluí-lo da seguinte maneira:

if(File.Exists(filepath))
{
     try
    {
         File.Delete(filepath);
    } 
    catch(Exception ex)
    {
      //Do something
    } 
}  
mishel vettukattil
fonte
2
Por que não apenas emitir a chamada Excluir independentemente e capturar qualquer exceção que indique que o arquivo não existia?
antred 23/05
32
if (System.IO.File.Exists(@"C:\test.txt"))
    System.IO.File.Delete(@"C:\test.txt"));

mas

System.IO.File.Delete(@"C:\test.txt");

fará o mesmo desde que a pasta exista.

Vercas
fonte
23

Se você deseja evitar um DirectoryNotFoundException, precisará garantir que o diretório do arquivo realmente exista. File.Existsrealiza isso. Outra maneira seria utilizar as classes utilidade Pathe Directoryassim:

string file = @"C:\subfolder\test.txt";
if (Directory.Exists(Path.GetDirectoryName(file)))
{
    File.Delete(file);
}
Derek W
fonte
15
  if (System.IO.File.Exists(@"C:\Users\Public\DeleteTest\test.txt"))
    {
        // Use a try block to catch IOExceptions, to 
        // handle the case of the file already being 
        // opened by another process. 
        try
        {
            System.IO.File.Delete(@"C:\Users\Public\DeleteTest\test.txt");
        }
        catch (System.IO.IOException e)
        {
            Console.WriteLine(e.Message);
            return;
        }
    }
Ahmed Ghazey
fonte
11
if (File.Exists(path))
{
    File.Delete(path);
}
ecMode
fonte
1

Se você estiver lendo esse arquivo usando o FileStream e depois quiser excluí-lo, feche o FileStream antes de chamar o File.Delete (caminho). Eu tive esse problema.

var filestream = new System.IO.FileStream(@"C:\Test\PutInv.txt", System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.ReadWrite);
filestream.Close();
File.Delete(@"C:\Test\PutInv.txt");
ag93
fonte
Ou use uma usingdeclaração, na qual ela File.Delete()sairia dos colchetes. No exemplo que você tem, você também deve fazer um filestream.Dispose();.
vapcguy
1

Às vezes, você deseja excluir um arquivo, seja qual for o caso (seja qual for a exceção, exclua o arquivo). Para tais situações.

public static void DeleteFile(string path)
        {
            if (!File.Exists(path))
            {
                return;
            }

            bool isDeleted = false;
            while (!isDeleted)
            {
                try
                {
                    File.Delete(path);
                    isDeleted = true;
                }
                catch (Exception e)
                {
                }
                Thread.Sleep(50);
            }
        }

Nota: Uma exceção não será lançada se o arquivo especificado não existir.

Hameed Syed
fonte
10
Então você está tentando excluir o arquivo 20 vezes por segundo até que seja excluído. E se, por algum motivo, o arquivo não puder ser excluído e o programa tentar excluí-lo para sempre? Eu não acho que essa seja uma boa solução.
Kv1dr
2
No mínimo, você deve fornecer um parâmetro de tempo limite.
antred 23/05
@ kv1dr à direita. Eu acho que você deve tentar por um tempo limitado e retornar uma mensagem de falha se o arquivo não foi excluído.
QMaster 29/12/19
0

Esta será a maneira mais simples,

if (System.IO.File.Exists(filePath)) 
{
  System.IO.File.Delete(filePath);
  System.Threading.Thread.Sleep(20);
}

Thread.sleep ajudará a funcionar perfeitamente; caso contrário, afetará a próxima etapa se estivermos copiando ou gravando o arquivo.

Outra maneira que eu fiz é,

if (System.IO.File.Exists(filePath))
{
System.GC.Collect();
System.GC.WaitForPendingFinalizers();
System.IO.File.Delete(filePath);
}
Aniyan Kolathur
fonte