Search code examples
c#imagedisposedelete-file

Cannot delete image (in use) C#


What I am trying to do here is:

  • Download an image
  • Save it to disk
  • Resize etc
  • Save it with a new name
  • Delete the old image

I have achieved everything but not the last step. I get the "file in use" error.

This is the code:

            filenameb = "img-1b.jpg";//old img
            fullpathb = Path.Combine(dir, filenameb);//old img path
            //downloading using imglink
            client.DownloadFile(imglink, fullpathb);//save old img as %dir%\img-1b.jpg
            //until here I downloaded the "old" img

            filename = "img-1.jpg";//new img
            fullpath = Path.Combine(dir, filename);//new img path
            //name and fullpath for the "new img" are set

            Image imgresize = Image.FromFile(fullpathb);//give old img path
            imgresize = FixedSize(imgresize);//resize
            imgresize.Save(fullpath, ImageFormat.Jpeg);//save new img as %dir%\img-1.jpg

            //EVERYTHING WORKS PERFECTLY UP TO HERE

            imgresize.Dispose();//dispose -has old img path
            System.IO.File.Delete(fullpathb);//delete old img

I also dispose the image in FixedSize. And this is the code of "FixedSize" if needed:

    //kind of messed up to save some space
    static Image FixedSize(Image imgPhoto)
    {
        int Width = 300;int Height = 250;
        int sourceWidth = imgPhoto.Width;int sourceHeight = imgPhoto.Height;
        int sourceX = 0;int sourceY = 0;int destX = 0;int destY = 0;
        float nPercent = 0;float nPercentW = 0;float nPercentH = 0;

        nPercentW = ((float)Width / (float)sourceWidth);
        nPercentH = ((float)Height / (float)sourceHeight);

        if (nPercentH < nPercentW){ nPercent = nPercentH;
            destX = (int)((Width - (sourceWidth * nPercent)) / 2);}
        else { nPercent = nPercentW;
            destY = (int)((Height - (sourceHeight * nPercent)) / 2); }

        int destWidth = (int)(sourceWidth * nPercent);
        int destHeight = (int)(sourceHeight * nPercent);

        Bitmap bmPhoto = new Bitmap(Width, Height, PixelFormat.Format24bppRgb);
        bmPhoto.SetResolution(imgPhoto.HorizontalResolution, imgPhoto.VerticalResolution);

        Graphics grPhoto = Graphics.FromImage(bmPhoto);
        grPhoto.Clear(Color.White);
        grPhoto.InterpolationMode = InterpolationMode.HighQualityBicubic;

        grPhoto.DrawImage(imgPhoto,
            new Rectangle(destX, destY, destWidth, destHeight),
            new Rectangle(sourceX, sourceY, sourceWidth, sourceHeight),
            GraphicsUnit.Pixel);

        grPhoto.Dispose();
        return bmPhoto;
    }

I am really new to this and I can't realise what i'm doing wrong (or what i am not doing at all). Any help is appreciated!


Solution

  • Image imgresize = Image.FromFile(fullpathb)
    

    This is going to lock the file. Instead, create an image from a MemoryStream of bytes read from the file

    byte[] imageBytes = FileReadAllBytes(fullpathb);
    
    using (var ms = new MemoryStream(imageBytes)){
        var image = Image.FromStream(ms);
    }
    

    Untested