Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Cannot delete an image file that is shown in a listview

In my listview I show thumbnails of small images in a certain folder. I setup the listview as follows:

var imageList = new ImageList();
foreach (var fileInfo in dir.GetFiles())
{
    try
    {
        var image = Image.FromFile(fileInfo.FullName);
        imageList.Images.Add(image);
    }
    catch
    {
        Console.WriteLine("error");
    }
}

listView.View = View.LargeIcon;
imageList.ImageSize = new Size(64, 64);
listView.LargeImageList = imageList;

for (int j = 0; j < imageList.Images.Count; j++)
{
    var item = new ListViewItem {ImageIndex = j, Text = "blabla"};
    listView.Items.Add(item);
}

The user can rightclick on an image in the listview to remove it. I remove it from the listview and then I want to delete this image from the folder. Now I get the error that the file is in use. Of course this is logical since the imagelist is using the file.

I tried to first remove the image from the imagelist, but I keep on having the file lock.

Can somebody tell me what I am doing wrong?

Thanks!

like image 306
Enrico Avatar asked Feb 28 '23 04:02

Enrico


2 Answers

You need to load the file into a MemoryStream, like this:

var image = Image.FromStream(new MemoryStream(File.ReadAllBytes(fileInfo.FullName)));

This way, the file will only be read once, and will not remain locked.

EDIT

You're loading the images into an ImageList.
Since the ImageList makes copies of its images, you should simply dispose the originals right away, like this:

using (var image = Image.FromFile(fileInfo.FullName))
    imageList.Images.Add(image);
like image 188
SLaks Avatar answered Mar 01 '23 16:03

SLaks


The image will need to be disposed of before it will unlock the file. Try calling Dispose on the image object after you remove it from the image list.

So long as you have a reference to the image object and the GC hasn't collected it, it will keep the lock. Calling Dispose should force it to give up its handle and cause the file to be unlocked.

You also have to make sure that the app didn't CopyHandle or otherwise get a second reference to the image resource before doing this.

like image 20
Frank Krueger Avatar answered Mar 01 '23 16:03

Frank Krueger