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)

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.


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.


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
    } 
}  

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.


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);
}

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;
        }
    }


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");

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.


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);
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.