none
Problema con eliminación de archivo RRS feed

  • Pregunta

  • Hola a todos, les explico un poco:

    Tengo un webform con un fileupload, el proceso es agarrar una imagen, guardar en disco, subir a BD y cuando ya este en BD eliminar el archivo.

    El problema es que sale error en el momento de eliminar "The process cannot access the file 'E:\DOC\TEMP\7 021.jpg' because it is being used by another process."

    Existe alguna manera de eliminar el proceso que que este utilizando el archivo, asignar un null o algo asi?

    Este es el codigo de subida:

    fupArchivo.SaveAs(rutArch);
    FileStream fs = new FileStream(rutArchDest, FileMode.Open);
                                            Byte[] archivo = new byte[fs.Length];
                                            fs.Read(archivo, 0, Convert.ToInt32(fs.Length));
    
                                            CArchivos objArchivo = new CArchivos();
                                            int codigoArchivo = objArchivo.agregarLicencia(archivo, fechaLicencia, txtNumLicencia.Text, fechaDesde, fechaHasta, Session[CVariablesSesion.usuarioAdministrador].ToString(), Session[CVariablesSesion.idEESS].ToString());
                                            if (codigoArchivo > 0)
                                                Response.Write("<script>alert('Licencia subido al Servidor Exitosamente.');window.location.href = '" + CVariablesSesion.PathAplicacion + "/Presentacion/Administrador/Liquidos/wfLiqArchivosEESS.aspx';</script>");
                                            else
                                                Response.Write("<script>alert('Ocurrio un error inesperado al subir el licencia al servidor.');window.location.href = '" + CVariablesSesion.PathAplicacion + "/Presentacion/Administrador/Liquidos/wfLiqArchivosEESS.aspx';</script>");

    Y bueno existe otro formulario muy aparte (al que se accede raramente) que en su page_load elimina los archivos de la carpeta temporal (donde se guardan los archivos antes de bajarlos a la BD), el codigo es este:

                            string directorio = ConfigurationManager.AppSettings["Directorio"] + "TEMP\\";
                            if (!Directory.Exists(directorio))
                                Directory.CreateDirectory(directorio);
                            string[] filePaths = Directory.GetFiles(directorio);
                            foreach (string filePath in filePaths)
                                File.Delete(filePath);

    El error que les dije salta en 

    File.Delete(filePath);

    Gracias de antemano.


    Roy Sillerico

    martes, 17 de marzo de 2015 19:55

Respuestas

  • Vamos a ver. Podrías hacer algo así:

            Stream imgMarcaAgua = marcaAguaImagen(fupArchivo.FileContent, Server.MapPath("~/UI/img/logoDCOD.png"), true);
            CArchivos objArchivo = new CArchivos();
            Byte[] archivo = new byte[imgMarcaAgua.Length];
            imgMarcaAgua.Read(archivo, 0, Convert.ToInt32(imgMarcaAgua.Length));
            int codigoArchivo = objArchivo.agregarLicencia(archivo, fechaLicencia, txtNumLicencia.Text, fechaDesde, fechaHasta, Session[CVariablesSesion.usuarioAdministrador].ToString(), Session[CVariablesSesion.idEESS].ToString());
            if (codigoArchivo > 0)
                Response.Write("<script>alert('Licencia subido al Servidor Exitosamente.');window.location.href = '" + CVariablesSesion.PathAplicacion + "/Presentacion/Administrador/Liquidos/wfLiqArchivosEESS.aspx';</script>");
            else
                Response.Write("<script>alert('Ocurrio un error inesperado al subir el licencia al servidor.');window.location.href = '" + CVariablesSesion.PathAplicacion + "/Presentacion/Administrador/Liquidos/wfLiqArchivosEESS.aspx';</script>");
    

    Modificando el método marcaAguaImagen:

        public Stream marcaAguaImagen(Stream imgOrig, string rutaMarca, bool transparencia)
        {
            bool exito = true;
            Stream imgResult = null;
            Image imgPhoto = null;
            Image imgWatermark = null;
            try
            {
                // Cargamos la foto original
                imgPhoto = Image.FromStream(imgOrig);
                // Cargamos la imagen de la marca de agua
                imgWatermark = new Bitmap(rutaMarca);
    
                double l = imgPhoto.Width * 1;
                double p = l / imgWatermark.Width;
                int w = (int)(imgWatermark.Width * p);
                int h = (int)(imgWatermark.Height * p);
                imgWatermark = resizeImage(imgWatermark, new Size(w, h));
            }
            catch (Exception ex)
            {
                exito = false;
            }
            if (exito)
            {
                // Obtenemos ancho y alto de la foto
                int phWidth = imgPhoto.Width;
                int phHeight = imgPhoto.Height;
    
                //Creamos un nuevo mapa de bits con el ancho y alto de la imagen origen
                Bitmap bmPhoto = new Bitmap(phWidth, phHeight,
                                     PixelFormat.Format24bppRgb);
                //bmPhoto.SetResolution(72, 72);
    
                // Obtenemos el objeto graphics del mapa de bits bmPhoto. 
                Graphics grPhoto = Graphics.FromImage(bmPhoto);
    
                int wmWidth = imgWatermark.Width;
                int wmHeight = imgWatermark.Height;
    
                // Suavizado de contorno
                grPhoto.SmoothingMode = SmoothingMode.AntiAlias;
                // Pintamos la imagen de origen
                grPhoto.DrawImage(imgPhoto, new Rectangle(0, 0, phWidth, phHeight), 0, 0, phWidth, phHeight, GraphicsUnit.Pixel);
                // Atributos para la marca de agua (por si deseamos cambiar la transparencia etc)
                ImageAttributes imageAttributes = new ImageAttributes();
    
                //Si deseamos transparencia
                if (transparencia)
                {
                    float[][] colorMatrixElements = { 
                           new float[] {1.0f,  0.0f,  0.0f,  0.0f, 0.0f},
                           new float[] {0.0f,  1.0f,  0.0f,  0.0f, 0.0f},
                           new float[] {0.0f,  0.0f,  1.0f,  0.0f, 0.0f},
                           new float[] {0.0f,  0.0f,  0.0f,  0.6f, 0.0f},
                           new float[] {0.0f,  0.0f,  0.0f,  0.0f, 1.0f}
                            };
    
                    ColorMatrix wmColorMatrix = new ColorMatrix(colorMatrixElements);
    
                    imageAttributes.SetColorMatrix(wmColorMatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);
                }
                // Posicion centrada de la marca de agua
                int xPosOfWm = (phWidth / 2) - (wmWidth / 2);
                int yPosOfWm = (phHeight / 2) - (wmHeight / 2);
                // Pintamos la marca de agua en nuestro mapa de bits.
                grPhoto.DrawImage(imgWatermark, new Rectangle(xPosOfWm, yPosOfWm, wmWidth, wmHeight), 0, 0, wmWidth, wmHeight, GraphicsUnit.Pixel, imageAttributes);
                // Vamos a cambiar la imagen por lo que la sacamos de memoria antes
                imgPhoto.Dispose();
                // Pasamos el bitmap a un Image para aprovecharnos de sus propiedades
                imgPhoto = bmPhoto;
                // Descargamos de memoria el graphics
                grPhoto.Dispose();
                // Devolvemos la imagen
                imgPhoto.Save(imgResult, ImageFormat.Jpeg);
    
                imgPhoto.Dispose();
                imgWatermark.Dispose();
            }
    
            return imgResult;
        }
    

    Puede que haya algún error porque no he podido probarlo, pero te puede servir par coger la idea.

    martes, 17 de marzo de 2015 22:39

Todas las respuestas

  • El problema es que intentas eliminarlo antes de que el sistema operativo lo haya liberado.

    En cualquier caso, si el objetivo es guardarlo en base de datos no necesitas guardarlo primero en disco.

    CArchivos objArchivo = new CArchivos();
    int codigoArchivo = objArchivo.agregarLicencia(fupArchivo.FileBytes, fechaLicencia, txtNumLicencia.Text, fechaDesde, fechaHasta, Session[CVariablesSesion.usuarioAdministrador].ToString(), Session[CVariablesSesion.idEESS].ToString());
    if (codigoArchivo > 0)
      Response.Write("<script>alert('Licencia subido al Servidor Exitosamente.');window.location.href = '" + CVariablesSesion.PathAplicacion + "/Presentacion/Administrador/Liquidos/wfLiqArchivosEESS.aspx';</script>");
    else
      Response.Write("<script>alert('Ocurrio un error inesperado al subir el licencia al servidor.');window.location.href = '" + CVariablesSesion.PathAplicacion + "/Presentacion/Administrador/Liquidos/wfLiqArchivosEESS.aspx';</script>");
    

    martes, 17 de marzo de 2015 20:03
  • Creo que si necesito, porque en las dos lineas:

    fupArchivo.SaveAs(rutArch);
    FileStream fs = new FileStream(rutArchDest, FileMode.Open);

    en medio de esas dos existe una linea mas

    fupArchivo.SaveAs(rutArch);
    marcaAguaImagen(rutArch, Server.MapPath("~/UI/img/logoDCOD.png"), rutArchDest, true);
    FileStream fs = new FileStream(rutArchDest, FileMode.Open);

    En esa línea del centro se coloca una marca de agua al archivo original (rutArch) y almacena el nuevo archivo marcado en otro (rutArchDest)

    O alguna idea que tengas para hacer este proceso?


    Roy Sillerico

    martes, 17 de marzo de 2015 20:54
  • Habría que ver el código del método marcaAguaImagen, pero en principio no debería ser necesario que se guarde físicamente en disco.
    martes, 17 de marzo de 2015 21:11
  • public bool marcaAguaImagen(string rutaImgOrig, string rutaMarca, string rutaImgDest, bool transparencia)
            {
                bool exito = true;
                Image imgPhoto = null;
                Image imgWatermark = null;
                try
                {
                    // Cargamos la foto original
                    imgPhoto = Image.FromFile(rutaImgOrig);
                    // Cargamos la imagen de la marca de agua
                    imgWatermark = new Bitmap(rutaMarca);
    
                    double l = imgPhoto.Width * 1;
                    double p = l / imgWatermark.Width;
                    int w = (int)(imgWatermark.Width * p);
                    int h = (int)(imgWatermark.Height * p);
                    imgWatermark = resizeImage(imgWatermark, new Size(w, h));
                }
                catch (Exception ex)
                {
                    exito = false;
                }
                if (exito)
                {
                    // Obtenemos ancho y alto de la foto
                    int phWidth = imgPhoto.Width;
                    int phHeight = imgPhoto.Height;
    
                    //Creamos un nuevo mapa de bits con el ancho y alto de la imagen origen
                    Bitmap bmPhoto = new Bitmap(phWidth, phHeight,
                                         PixelFormat.Format24bppRgb);
                    //bmPhoto.SetResolution(72, 72);
    
                    // Obtenemos el objeto graphics del mapa de bits bmPhoto. 
                    Graphics grPhoto = Graphics.FromImage(bmPhoto);
    
                    int wmWidth = imgWatermark.Width;
                    int wmHeight = imgWatermark.Height;
    
                    // Suavizado de contorno
                    grPhoto.SmoothingMode = SmoothingMode.AntiAlias;
                    // Pintamos la imagen de origen
                    grPhoto.DrawImage(imgPhoto, new Rectangle(0, 0, phWidth, phHeight), 0, 0, phWidth, phHeight, GraphicsUnit.Pixel);
                    // Atributos para la marca de agua (por si deseamos cambiar la transparencia etc)
                    ImageAttributes imageAttributes = new ImageAttributes();
    
                    //Si deseamos transparencia
                    if (transparencia)
                    {
                        float[][] colorMatrixElements = { 
                           new float[] {1.0f,  0.0f,  0.0f,  0.0f, 0.0f},
                           new float[] {0.0f,  1.0f,  0.0f,  0.0f, 0.0f},
                           new float[] {0.0f,  0.0f,  1.0f,  0.0f, 0.0f},
                           new float[] {0.0f,  0.0f,  0.0f,  0.6f, 0.0f},
                           new float[] {0.0f,  0.0f,  0.0f,  0.0f, 1.0f}
                            };
    
                        ColorMatrix wmColorMatrix = new ColorMatrix(colorMatrixElements);
    
                        imageAttributes.SetColorMatrix(wmColorMatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);
                    }
                    // Posicion centrada de la marca de agua
                    int xPosOfWm = (phWidth / 2) - (wmWidth / 2);
                    int yPosOfWm = (phHeight / 2) - (wmHeight / 2);
                    // Pintamos la marca de agua en nuestro mapa de bits.
                    grPhoto.DrawImage(imgWatermark, new Rectangle(xPosOfWm, yPosOfWm, wmWidth, wmHeight), 0, 0, wmWidth, wmHeight, GraphicsUnit.Pixel, imageAttributes);
                    // Vamos a cambiar la imagen por lo que la sacamos de memoria antes
                    imgPhoto.Dispose();
                    // Pasamos el bitmap a un Image para aprovecharnos de sus propiedades
                    imgPhoto = bmPhoto;
                    // Descargamos de memoria el graphics
                    grPhoto.Dispose();
                    // Guardamos la imagen
                    imgPhoto.Save(rutaImgDest, ImageFormat.Jpeg);
    
                    imgPhoto.Dispose();
                    imgWatermark.Dispose();
                }
    
                return exito;
            }


    Roy Sillerico

    martes, 17 de marzo de 2015 21:13
  • Vamos a ver. Podrías hacer algo así:

            Stream imgMarcaAgua = marcaAguaImagen(fupArchivo.FileContent, Server.MapPath("~/UI/img/logoDCOD.png"), true);
            CArchivos objArchivo = new CArchivos();
            Byte[] archivo = new byte[imgMarcaAgua.Length];
            imgMarcaAgua.Read(archivo, 0, Convert.ToInt32(imgMarcaAgua.Length));
            int codigoArchivo = objArchivo.agregarLicencia(archivo, fechaLicencia, txtNumLicencia.Text, fechaDesde, fechaHasta, Session[CVariablesSesion.usuarioAdministrador].ToString(), Session[CVariablesSesion.idEESS].ToString());
            if (codigoArchivo > 0)
                Response.Write("<script>alert('Licencia subido al Servidor Exitosamente.');window.location.href = '" + CVariablesSesion.PathAplicacion + "/Presentacion/Administrador/Liquidos/wfLiqArchivosEESS.aspx';</script>");
            else
                Response.Write("<script>alert('Ocurrio un error inesperado al subir el licencia al servidor.');window.location.href = '" + CVariablesSesion.PathAplicacion + "/Presentacion/Administrador/Liquidos/wfLiqArchivosEESS.aspx';</script>");
    

    Modificando el método marcaAguaImagen:

        public Stream marcaAguaImagen(Stream imgOrig, string rutaMarca, bool transparencia)
        {
            bool exito = true;
            Stream imgResult = null;
            Image imgPhoto = null;
            Image imgWatermark = null;
            try
            {
                // Cargamos la foto original
                imgPhoto = Image.FromStream(imgOrig);
                // Cargamos la imagen de la marca de agua
                imgWatermark = new Bitmap(rutaMarca);
    
                double l = imgPhoto.Width * 1;
                double p = l / imgWatermark.Width;
                int w = (int)(imgWatermark.Width * p);
                int h = (int)(imgWatermark.Height * p);
                imgWatermark = resizeImage(imgWatermark, new Size(w, h));
            }
            catch (Exception ex)
            {
                exito = false;
            }
            if (exito)
            {
                // Obtenemos ancho y alto de la foto
                int phWidth = imgPhoto.Width;
                int phHeight = imgPhoto.Height;
    
                //Creamos un nuevo mapa de bits con el ancho y alto de la imagen origen
                Bitmap bmPhoto = new Bitmap(phWidth, phHeight,
                                     PixelFormat.Format24bppRgb);
                //bmPhoto.SetResolution(72, 72);
    
                // Obtenemos el objeto graphics del mapa de bits bmPhoto. 
                Graphics grPhoto = Graphics.FromImage(bmPhoto);
    
                int wmWidth = imgWatermark.Width;
                int wmHeight = imgWatermark.Height;
    
                // Suavizado de contorno
                grPhoto.SmoothingMode = SmoothingMode.AntiAlias;
                // Pintamos la imagen de origen
                grPhoto.DrawImage(imgPhoto, new Rectangle(0, 0, phWidth, phHeight), 0, 0, phWidth, phHeight, GraphicsUnit.Pixel);
                // Atributos para la marca de agua (por si deseamos cambiar la transparencia etc)
                ImageAttributes imageAttributes = new ImageAttributes();
    
                //Si deseamos transparencia
                if (transparencia)
                {
                    float[][] colorMatrixElements = { 
                           new float[] {1.0f,  0.0f,  0.0f,  0.0f, 0.0f},
                           new float[] {0.0f,  1.0f,  0.0f,  0.0f, 0.0f},
                           new float[] {0.0f,  0.0f,  1.0f,  0.0f, 0.0f},
                           new float[] {0.0f,  0.0f,  0.0f,  0.6f, 0.0f},
                           new float[] {0.0f,  0.0f,  0.0f,  0.0f, 1.0f}
                            };
    
                    ColorMatrix wmColorMatrix = new ColorMatrix(colorMatrixElements);
    
                    imageAttributes.SetColorMatrix(wmColorMatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);
                }
                // Posicion centrada de la marca de agua
                int xPosOfWm = (phWidth / 2) - (wmWidth / 2);
                int yPosOfWm = (phHeight / 2) - (wmHeight / 2);
                // Pintamos la marca de agua en nuestro mapa de bits.
                grPhoto.DrawImage(imgWatermark, new Rectangle(xPosOfWm, yPosOfWm, wmWidth, wmHeight), 0, 0, wmWidth, wmHeight, GraphicsUnit.Pixel, imageAttributes);
                // Vamos a cambiar la imagen por lo que la sacamos de memoria antes
                imgPhoto.Dispose();
                // Pasamos el bitmap a un Image para aprovecharnos de sus propiedades
                imgPhoto = bmPhoto;
                // Descargamos de memoria el graphics
                grPhoto.Dispose();
                // Devolvemos la imagen
                imgPhoto.Save(imgResult, ImageFormat.Jpeg);
    
                imgPhoto.Dispose();
                imgWatermark.Dispose();
            }
    
            return imgResult;
        }
    

    Puede que haya algún error porque no he podido probarlo, pero te puede servir par coger la idea.

    martes, 17 de marzo de 2015 22:39