Usuario
¿Cómo cerrar el proceso donde se utiliza la ruta de un archivo?

Pregunta
-
void EnviarCorreo() { System.Net.Mail.MailMessage mensaje = new System.Net.Mail.MailMessage(); System.Net.Mail.SmtpClient cliente = new System.Net.Mail.SmtpClient(); mensaje.To.Add(EmailEstudiante); mensaje.Subject = "Mensaje de Prueba con Archivos"; mensaje.SubjectEncoding = System.Text.Encoding.UTF8; System.Net.Mail.Attachment archivo = new System.Net.Mail.Attachment(@"D:\FichaMatriculaEstudiante.pdf"); mensaje.Attachments.Add(archivo); mensaje.Body = "Cuerpo de mensaje de prueba 02: Gracias por tu apoyo"; mensaje.SubjectEncoding = System.Text.Encoding.UTF8; mensaje.IsBodyHtml = true; mensaje.From = new System.Net.Mail.MailAddress("CorreoUsuario@gmail.com"); cliente.Credentials = new System.Net.NetworkCredential("CorreoUsuario@gmail.com","Contraseña"); cliente.Port = 587; cliente.EnableSsl = true; cliente.Host = "smtp.gmail.com"; try { cliente.Send(mensaje); } catch(Exception ex) { MessageBox.Show(Convert.ToString(ex), "Alerta", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } finally { EliminarPDF(); } }
Metodo para envíar un correo electrónico con un archivo de adjunto.
(@"D:\FichaMatriculaEstudiante.pdf")
(@"D:\FichaMatriculaEstudiante.pdf")
void EliminarPDF() { String ruta = @"D:\FichaMatriculaEstudiante.pdf"; try { if (File.Exists(ruta)) { System.IO.File.Delete(ruta); } else { MessageBox.Show("¡El archivo ya no existe!", "Alerta", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } } catch (Exception e) { MessageBox.Show("Error al borrar archivo: {0}"+ e.ToString(), "Alerta", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } }
Luego para eliminar el archivo que eh enviado me sale el error de que aún se sigue utilizando el archivo en otro proceso, y me supongo que es en el de EnviarCorreo
Todas las respuestas
-
La clase System.Net.Mail.Attachment es IDisposable. Asegúrate de llamar a su método Dispose() cuando termines de enviar el correo, para que no mantenga bloqueado el archivo.
Por cierto, el SmtpClient también es IDisposable y por tanto también deberías llamar a su Dispose(). Eso no afectará al bloqueo del archivo, pero si envías muchos correos muy seguidos puede ser que agotes las conexiones al servidor de correo y te empiece a dar errores.
Puedes meter ambas llamadas en el finally, antes de llamar a EliminarPDF.
- Propuesto como respuesta Sergio ParraModerator martes, 24 de noviembre de 2020 12:52
-
Muchas gracias por su ayuda, pero no entendí la parte de Agotar las conexiones al servidor, talves me puedas explicar, porque lo entiendo de esta manera, GMAIL te da una cierta cantidad de envíos de correos y luego tengo que comprar el servicio o que?
-
No tiene nada que ver. Se refiere a las conexiones que abres y no cierras. Si abres una conexión y no la cierras, se queda abierta hasta que caduca su tiempo de espera o se ejecuta el Garbage Collector y la libera. En el caso del SmtpClient se refiere a la conexión TCP al puerto del servidor de correo. Se te pueden agotar las conexiones bien sea porque agotes los puertos efímeros de Windows, o porque el servidor de destino considere que al abrir miles de conexiones y no cerrarlas lo estás atacando, y te bloquee la apertura de nuevas conexiones.
- Propuesto como respuesta Sergio ParraModerator martes, 24 de noviembre de 2020 12:52
-
Hola VelizBruno,
¿Alguna novedad sobre la consulta realizada? ¿Han sido útiles las respuestas proporcionadas?
Espero su respuesta.
Gracias por usar los foros de MSDN.
Andres Aguilar
____________________________
Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde.
Si tiene algún cumplido o reclamo sobre el soporte de MSDN sientase en la libertad de contactar MSDNFSF@microsoft.com.