Cómo verificar si System.IO.File.Delete eliminó un archivo con éxito

Después de eliminar un archivo usando la clase system.io.file:

System.IO.File.Delete(openedPdfs.path); 

Necesito ejecutar algún código si el archivo fue eliminado exitosamente. Mientras el método no devuelva ningún valor, estoy comprobando si el archivo existe después del método de eliminación. Si todavía existe, supuse que la operación había fallado.

El problema es que el método de eliminación funciona bien, pero hay un par de segundos para que se elimine el archivo. La función Exist devuelve true porque en el momento en que está verificando que el archivo está allí.

¿Cómo puedo verificar con seguridad si System.IO.File.Delete(openedPdfs.path); ¿Completado satisfactoriamente?

Código:

 FileInfo file = new FileInfo(openedPdfs.path); System.IO.File.Delete(openedPdfs.path); if (file.Exists == false) { ... } else { ... } 

Delete debe lanzar una excepción si el archivo no fue eliminado. Por lo tanto, su llamada a Exists es redundante.

Echa un vistazo a la documentación para Delete .

Como otros han señalado, el método File.Delete lanzará una excepción en caso de falla.

Lo que omitieron señalar es que la excepción se lanzará en casi todos los casos, pero no en todos los casos . Específicamente, el método File.Delete no lanzará una excepción si el archivo que se va a eliminar ya no existía. (¿Duh? ¿En qué estaban pensando?)

Por lo tanto, debe verificar si el archivo existe antes de borrarlo; Si no existe, no debes hacer nada. Si existe, debe invocar File.Delete , y si eso File.Delete una excepción, nuevamente, no debe hacer nada, porque el archivo no se eliminó. De lo contrario, deberías hacer tus cosas posteriores a la eliminación exitosa de archivos existentes.

Esto es accesorio a la respuesta de Daniel A. White: Podemos ver que la firma para el método es public static void Delete(string path) . Claramente, no recibirá comentarios de la llamada Eliminar excepto por excepción. Pero supongamos que tiene un archivo que se escribe o actualiza periódicamente mediante otro proceso:

  1. Su progtwig elimina con éxito el archivo.
  2. El otro proceso lo vuelve a crear inmediatamente después de la eliminación.
  3. Su progtwig prueba su existencia con file.Exists . Hay un nuevo archivo con el mismo nombre, por lo que devuelve verdadero. Técnicamente vas por el camino equivocado.

Es posible que este escenario exacto no sea cierto para el problema que está tratando de resolver, pero verificar si la llamada Eliminar arrojó una excepción es mucho más sólido que confiar en su implementación actual.

Siempre puedes usar

  System.IO.File.Exists(path) 

Aunque estoy de acuerdo con Daniel, si Eliminar no lanza una excepción, debería ser bueno.

De los comentarios y sugerencias, debería poder utilizar lo siguiente para lograr el resultado deseado

 try { FileInfo file = new FileInfo(openedPdfs.path); System.IO.File.Delete(openedPdfs.path); // if no exception is thrown then you should assume all has gone well and put // your file successfully deleted code here. } catch /*(Specfic exceptions can be referenced here in separate catch blocks see Daniel A. White answer)*/ { // If something bad happened and the file was not deleted put handling code here } finally { // if some action needs to be taken regardless of whether the file was successfully deleted or not put // that code here } 

No lanzará excepción si el archivo no existe. En caso de error, se lanzará una excepción si no se pudo eliminar, verifique File.Delete

Descubrí que si utiliza el método de instancia FileInfo Delete (), la propiedad de instancia de FileInfo existe no se actualiza.
Por ejemplo, el siguiente código lanzará una excepción de archivo no encontrado porque el archivo se ha eliminado pero el segundo if (output_file.Exists) aún se evalúa como verdadero.

 FileInfo output_file; if (output_file.Exists) output_file.Delete(); FileStream fs; if (output_file.Exists) { fs = new FileStream(fi.FullName, FileMode.Open, FileAccess.ReadWrite); } else { fs = new FileStream(fi.FullName, FileMode.CreateNew, FileAccess.ReadWrite); } 

Encontré que crear un nuevo FileInfo a partir del anterior solucionó el problema:

 FileInfo output_file; if (output_file.Exists) { output_file.Delete(); output_file = new FileInfo(output_file.FullName); } FileStream fs; if (output_file.Exists) { fs = new FileStream(fi.FullName, FileMode.Open, FileAccess.ReadWrite); } else { fs = new FileStream(fi.FullName, FileMode.CreateNew, FileAccess.ReadWrite); } 
 private String del(String fileLocation) { if (File.Exists(@fileLocation)) { try { File.Delete(@fileLocation); } catch (Exception e) { return "File couldn't be deleted because: " + e.GetType().Name; } } else { return "File doesn't exist"; } return "File successfully deleted"; }