Search code examples
c#.netwinformslistviewfilelock

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!


Solution

  • 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);