Cómo eliminar un archivo después de verificar si existe

220

¿Cómo puedo eliminar un archivo en C # C:\test.txt, por ejemplo , aunque aplique el mismo tipo de método que en los archivos por lotes, por ejemplo?

if exist "C:\test.txt"

delete "C:\test.txt"

else 

return nothing (ignore)
Tom
fuente

Respuestas:

388

Esto es bastante sencillo con la clase File .

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


Como Chris señaló en los comentarios, en realidad no necesita hacer la File.Existsverificación, ya File.Deleteque no arroja una excepción si el archivo no existe, aunque si está utilizando rutas absolutas, necesitará la verificación para asegurarse de que toda la ruta del archivo es válida.

Adam Lear
fuente
13
Esa prueba no es realmente necesaria. Mira mi post.
Chris Eberle
20
La prueba es necesaria si desea evitar una posible DirectoryNotFoundException.
Timothy Strimple
77
La prueba no debe usarse en lugar de manejo de excepciones, sino más bien en conducción con ella. Cualquier número de escenarios puede dar como resultado que la verificación existente devuelva verdadero y Eliminar lanzamiento.
Josh
1
¿Por qué hay un @antes de la ruta del archivo? Para mí funciona sin.
Pascal Ackermann
55
@ evita que tengas que duplicar las barras invertidas.
PRMan
105

Utilice System.IO.File.Delete así:

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

De la documentación:

Si el archivo que se va a eliminar no existe, no se produce ninguna excepción.

Chris Eberle
fuente
77
Eso arrojará una DirectoryNotFoundException si "La ruta especificada no es válida (por ejemplo, está en una unidad no asignada)".
Timothy Strimple
55
Que extraño. Intellisense dice An exception is thrown if the specified file does not exist.
fearofawhackplanet
¿Quizás estás usando una versión diferente del marco .NET?
Chris Eberle
1
Estoy usando .Net4, parece que el IntelliSense está mal Tengo ejecutar un cheque y no es una excepción es lanzada
fearofawhackplanet
3
Sí, lo intenté y System.IO.File.Delete(@"C:\test.txt");es suficiente. Gracias
Berkay Turancı
34

Puede importar el System.IOespacio de nombres usando:

using System.IO;

Si la ruta del archivo representa la ruta completa al archivo, puede verificar su existencia y eliminarla de la siguiente manera:

if(File.Exists(filepath))
{
     try
    {
         File.Delete(filepath);
    } 
    catch(Exception ex)
    {
      //Do something
    } 
}  
mishel vettukattil
fuente
2
¿Por qué no simplemente emitir la llamada Eliminar independientemente y detectar cualquier excepción que indique que el archivo no existía?
antred
32
if (System.IO.File.Exists(@"C:\test.txt"))
    System.IO.File.Delete(@"C:\test.txt"));

pero

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

hará lo mismo mientras exista la carpeta.

Vercas
fuente
23

Si desea evitarlo DirectoryNotFoundException, deberá asegurarse de que el directorio del archivo exista. File.Existslogra esto. Otra forma sería utilizar las clases de utilidad Pathy Directoryasí:

string file = @"C:\subfolder\test.txt";
if (Directory.Exists(Path.GetDirectoryName(file)))
{
    File.Delete(file);
}
Derek W
fuente
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
fuente
11
if (File.Exists(path))
{
    File.Delete(path);
}
ecMode
fuente
1

Si está leyendo ese archivo usando FileStream y luego desea eliminarlo, asegúrese de cerrar FileStream antes de llamar a File.Delete (ruta). Tuve este 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
fuente
O use una usingdeclaración, donde File.Delete()iría fuera de los corchetes. En el ejemplo que tiene, también debe hacer a filestream.Dispose();.
vapcguy
1

A veces desea eliminar un archivo en cualquier caso (cualquiera que sea la excepción, elimine el archivo). Para tales situaciones.

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: No se genera una excepción si el archivo especificado no existe.

Hameed Syed
fuente
10
Entonces está intentando eliminar el archivo 20 veces por segundo hasta que se elimine. ¿Qué sucede si, por alguna razón, el archivo no se puede eliminar y el programa intentará eliminarlo para siempre? No creo que esta sea una buena solución.
kv1dr
2
Como mínimo, debe proporcionar un parámetro de tiempo de espera.
antred
@ kv1dr a la derecha. Creo que debería intentarlo por un tiempo limitado y devolver un mensaje de error si el archivo no se eliminó.
QMaster
0

Esta será la forma más simple,

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

Thread.sleep ayudará a funcionar perfectamente, de lo contrario, afectará el siguiente paso si copiamos o escribimos el archivo.

Otra forma en que lo hice es,

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