• Domingo 22 de Diciembre de 2024, 14:53

Autor Tema:  copiar un archivo y luego volver a usarlo  (Leído 3111 veces)

kancerman

  • Nuevo Miembro
  • *
  • Mensajes: 17
    • Ver Perfil
copiar un archivo y luego volver a usarlo
« en: Jueves 3 de Marzo de 2011, 05:03 »
0
necesito copiar un archivo y luego volver a ocuparlo , utilizo el siguiente codigo
System.IO.File.Copy("C:\documentos\temp.doc", "c:\documentos\cotizacion " + TB_Nombre_Cotizacion_Nueva.Text + ".doc", true);
pero al tratar de volver a ocupar el archivo creado osea el "c:\documentos\cotizacion " + TB_Nombre_Cotizacion_Nueva.Text + ".doc"
me sale un error que el archivo esta en uso por otro proceso es como que la aplicacion lo deja lockeado
ojala puedan ayudarme
gracias

gabio2

  • Miembro MUY activo
  • ***
  • Mensajes: 402
  • Nacionalidad: mx
    • Ver Perfil
Re: copiar un archivo y luego volver a usarlo
« Respuesta #1 en: Jueves 3 de Marzo de 2011, 15:27 »
0
Seria de mucha ayuda que pongas el código completo de esa sección... para ver como lo tienes hecho y así darte una mejor respuesta, no olvides comentar la linea donde ocurre dicho error.. saludos. :)
@gabio87

kancerman

  • Nuevo Miembro
  • *
  • Mensajes: 17
    • Ver Perfil
Re: copiar un archivo y luego volver a usarlo
« Respuesta #2 en: Viernes 4 de Marzo de 2011, 07:12 »
0
disculpa por no responder antes esto es mas o menos lo que tengo necesito editar un documento word y luego en viarlo por mail

//copio el docuemnto original a uno temporal y lo abro
                object doNotSaveChanges = Word.WdSaveOptions.wdDoNotSaveChanges;
                object saveChanges = Word.WdSaveOptions.wdSaveChanges;
                System.IO.File.Copy("C:\documentos\prueba.docx", "c:\documentos\temp.doc", true);
                Word.Application wordApp = new Word.Application();
                Word.Document aDoc = null;
                object filename = "c:\documentos\temp.doc";

//edito el documento
                if (System.IO.File.Exists((string)filename))
                {
                    object readOnly = false;
                    object isVisible = false;
                    aDoc = wordApp.Documents.Open(ref filename, ref readOnly, ref isVisible);
                    aDoc.Activate();
                    this.FindAndReplace(wordApp, "<fecha>", dateTimePicker1.Text);
                    this.FindAndReplace(wordApp, "<nombre>", TB_Nombre_Cotizacion_Nueva.Text.Trim());
                    this.FindAndReplace(wordApp, "<tipo_evento>", CB_tipo_evento_Cotizacion_Nueva.Text.Trim());
                    this.FindAndReplace(wordApp, "<precio>", TB_Precio_Cotizacion_Nueva.Text.Trim());
                    aDoc.Save();
//cierro el documento
                    ((Word._Document)aDoc).Close();
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(aDoc);

                }
                else
                {
                    MessageBox.Show("El archivo no existe.", "No Existe", MessageBoxButtons.OK, MessageBoxIcon.Information);

                }
//copio el temporal a uno final que sera el que se envia
                System.IO.File.Copy("C:\documentos\temp.doc", "c:\documentos\cotizacion " + TB_Nombre_Cotizacion_Nueva.Text + ".doc", true);
//envio el documento
                Enviar(TB_Enviar_Cotizacion_Nueva.Text);

//esta es metodo para enviar
public static bool Enviar(string a)
        {
           
            string PathFile = @"c:\documentos\"+TB_Nombre_Cotizacion_Nueva.Text +".doc";
           System.Net.Mail.MailMessage msg = new System.Net.Mail.MailMessage();

            msg.To.Add(a);

            msg.From = new MailAddress("luisbazanmontana@gmail.com", "", System.Text.Encoding.UTF8);
            msg.SubjectEncoding = Encoding.UTF8;

            msg.Subject = "Cotizacion";

            msg.SubjectEncoding = System.Text.Encoding.UTF8;

            msg.Body = "Mensaje del correo";
           
            msg.BodyEncoding = System.Text.Encoding.UTF8;

            msg.IsBodyHtml = false;

            Attachment Data = new Attachment(PathFile);

            msg.Attachments.Add(Data);

            SmtpClient client = new SmtpClient();

            client.UseDefaultCredentials = false;

            client.Credentials = new System.Net.NetworkCredential("micorreo@gmail.com", "mipass");
           
            client.Port = 587;
           
            client.Host = "smtp.gmail.com";

            client.EnableSsl = true;
           

            try
            {
               
                client.Send(msg);
                MessageBox.Show("Se ha enviado exitosamente ");
                return true;
            }
            catch (System.Net.Mail.SmtpException ex)
            {
                MessageBox.Show("No se mando"+ex, "No Existe", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return false;
            }
        }

el error lo tira cuando intento enviar por segunda vez el archivo, la primera vez que lo envio no da problemas pero si lo intento enviar una segunda vez se cae la aplicacion

gracias por responder

tannke

  • Miembro MUY activo
  • ***
  • Mensajes: 152
  • Nacionalidad: es
    • Ver Perfil
Re: copiar un archivo y luego volver a usarlo
« Respuesta #3 en: Viernes 4 de Marzo de 2011, 16:36 »
0
Muy buenas, contesto sin saber mucho de este tema, nunca me he centrado mucho en el envio de correo salvo alguna ocasión concreta y sencilla. Bueno, has provado con un msg.Dispose();

Por otro lado, que no se si afecta o no, pero yo pensaba que si, donde declaras este "string".
Código: C#
  1. string PathFile = @"c:\documentos\"+TB_Nombre_Cotizacion_Nueva.Text +".doc";
  2.  
estas poniendo la "@" y a la vez las \. Al colocar la "@" solo es necesario poner una barra.

Otra cosa cuando publiques codigo intenta ponerlo con la opcion Code, seleccionando C#, es que asi se hace muy dificil leerlo.

Un saludo

kancerman

  • Nuevo Miembro
  • *
  • Mensajes: 17
    • Ver Perfil
Re: copiar un archivo y luego volver a usarlo
« Respuesta #4 en: Domingo 6 de Marzo de 2011, 01:34 »
0
hola gracias por responder y de ahora en adelante voy a poner el codigo como corresponde, le elimine los slash dobles pero el problema continua

Código: C#
  1.  
  2. //copio el docuemnto original a uno temporal y lo abro
  3. object doNotSaveChanges = Word.WdSaveOptions.wdDoNotSaveChanges;
  4. object saveChanges = Word.WdSaveOptions.wdSaveChanges;
  5. System.IO.File.Copy("C:\documentos\prueba.docx", "c:\documentos\temp.doc", true);
  6. Word.Application wordApp = new Word.Application();
  7. Word.Document aDoc = null;
  8. object filename = "c:\documentos\temp.doc";
  9.  
  10. //edito el documento
  11. if (System.IO.File.Exists((string)filename))
  12. {
  13. object readOnly = false;
  14. object isVisible = false;
  15. aDoc = wordApp.Documents.Open(ref filename, ref readOnly, ref isVisible);
  16. aDoc.Activate();
  17. this.FindAndReplace(wordApp, "<fecha>", dateTimePicker1.Text);
  18. this.FindAndReplace(wordApp, "<nombre>", TB_Nombre_Cotizacion_Nueva.Text.Trim());
  19. this.FindAndReplace(wordApp, "<tipo_evento>", CB_tipo_evento_Cotizacion_Nueva.Text.Trim());
  20. this.FindAndReplace(wordApp, "<precio>", TB_Precio_Cotizacion_Nueva.Text.Trim());
  21. aDoc.Save();
  22. //cierro el documento
  23. ((Word._Document)aDoc).Close();
  24. System.Runtime.InteropServices.Marshal.ReleaseComObject(aDoc);
  25.  
  26. }
  27. else
  28. {
  29. MessageBox.Show("El archivo no existe.", "No Existe", MessageBoxButtons.OK, MessageBoxIcon.Information);
  30.  
  31. }
  32. //copio el temporal a uno final que sera el que se envia
  33. System.IO.File.Copy("C:\documentos\temp.doc", "c:\documentos\cotizacion " + TB_Nombre_Cotizacion_Nueva.Text + ".doc", true);
  34. //envio el documento
  35. Enviar(TB_Enviar_Cotizacion_Nueva.Text);
  36.  
  37. //esta es metodo para enviar
  38. public static bool Enviar(string a)
  39. {
  40.  
  41. string PathFile = @"c:\documentos\"+TB_Nombre_Cotizacion_Nueva.Text +".doc";
  42. System.Net.Mail.MailMessage msg = new System.Net.Mail.MailMessage();
  43.  
  44. msg.To.Add(a);
  45.  
  46. msg.From = new MailAddress("luisbazanmontana@gmail.com", "", System.Text.Encoding.UTF8);
  47. msg.SubjectEncoding = Encoding.UTF8;
  48.  
  49. msg.Subject = "Cotizacion";
  50.  
  51. msg.SubjectEncoding = System.Text.Encoding.UTF8;
  52.  
  53. msg.Body = "Mensaje del correo";
  54.  
  55. msg.BodyEncoding = System.Text.Encoding.UTF8;
  56.  
  57. msg.IsBodyHtml = false;
  58.  
  59. Attachment Data = new Attachment(PathFile);
  60.  
  61. msg.Attachments.Add(Data);
  62.  
  63. SmtpClient client = new SmtpClient();
  64.  
  65. client.UseDefaultCredentials = false;
  66.  
  67. client.Credentials = new System.Net.NetworkCredential("micorreo@gmail.com", "mipass");
  68.  
  69. client.Port = 587;
  70.  
  71. client.Host = "smtp.gmail.com";
  72.  
  73. client.EnableSsl = true;
  74.  
  75.  
  76. try
  77. {
  78.  
  79. client.Send(msg);
  80. MessageBox.Show("Se ha enviado exitosamente ");
  81. return true;
  82. }
  83. catch (System.Net.Mail.SmtpException ex)
  84. {
  85. MessageBox.Show("No se mando"+ex, "No Existe", MessageBoxButtons.OK, MessageBoxIcon.Information);
  86. return false;
  87. }
  88. }
  89.  
  90.  



EDIT: ya lo arregle gracias a todos los que me ayudaron
por si a alguien le ocurre lo mismo esta fue la solucion
al crear el attachment data este obviamente ocupaba el pathfile osea el archivo doc por lo tanto una vez enviado habia que agregar una linea liberandolo quedaria asi
Código: C#
  1.  
  2.  
  3. client.Send(msg);
  4. MessageBox.Show("Se ha enviado exitosamente ");
  5. return true;
  6. Data.Dispose(); //<----- linea agregada que soluciona el problema
  7.  
  8.  

tannke

  • Miembro MUY activo
  • ***
  • Mensajes: 152
  • Nacionalidad: es
    • Ver Perfil
Re: copiar un archivo y luego volver a usarlo
« Respuesta #5 en: Domingo 6 de Marzo de 2011, 03:30 »
0
Me alegro que resolvieras el problema. Un saludo!

gabio2

  • Miembro MUY activo
  • ***
  • Mensajes: 402
  • Nacionalidad: mx
    • Ver Perfil
Re: copiar un archivo y luego volver a usarlo
« Respuesta #6 en: Domingo 6 de Marzo de 2011, 18:35 »
0
Uff!.. los pequeños detalles son los más dificiles de ver!!.. muy bien hecho kancerman! :)
@gabio87

kancerman

  • Nuevo Miembro
  • *
  • Mensajes: 17
    • Ver Perfil
Re: copiar un archivo y luego volver a usarlo
« Respuesta #7 en: Domingo 6 de Marzo de 2011, 22:13 »
0
muchas gracias he aprendido muchisimo en este foro

gerardoskype

  • Miembro activo
  • **
  • Mensajes: 50
  • Nacionalidad: mx
    • Ver Perfil
Re: copiar un archivo y luego volver a usarlo
« Respuesta #8 en: Sábado 2 de Abril de 2011, 03:25 »
0
así es, toda ruta o archivo que se utiliza debe ser liberado o limpiado para poder utilizarlo de nuevo, de lo contrario, queda en la memoria y no se puede utilizar.