Невозможно удалить файл изображения, который отображается в ListView

StackOverflow https://stackoverflow.com/questions/2686062

Вопрос

В моем списке я покажу миниатюры небольших изображений в определенной папке. Я настрою список ListView следующим образом:

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

Пользователь может вычеркнуть на изображение в списке, чтобы удалить его. Я удаляю его из списка, а затем я хочу удалить это изображение из папки. Теперь я получаю ошибку, что файл используется. Конечно, это логично, так как ImageList использует файл.

Я пытался сначала удалить изображение от ImageList, но я держусь в блокировке файлов.

Кто-нибудь может сказать мне, что я делаю не так?

Спасибо!

Это было полезно?

Решение

Вам нужно загрузить файл в MemoryStream, как это:

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

Таким образом, файл будет читаться только один раз, и не останется заблокированным.

РЕДАКТИРОВАТЬ

Вы загружаете изображения в ImageList.
Поскольку ImageList производит копии своих изображений, вы должны просто утилизировать оригиналы прямо сейчас:

using (var image = Image.FromFile(fileInfo.FullName))
    imageList.Images.Add(image);

Другие советы

Изображение нужно будет утилизировать, прежде чем он разблокирует файл. Попробуйте позвонить Dispose На объекте изображения после удаления его из списка изображений.

Пока у вас есть ссылка на объект Image, и GC не собирал его, он сохранит замок. Призыв Dispose следует заставить его отказаться от ее ручки и привести к разблокированному файлу.

Вы также должны убедиться, что приложение не CopyHandle или иначе получить вторую ссылку на ресурс изображения, прежде чем делать это.

Использовать GetThumbnailImage А потом утилизируйте изображение:

var image = Image.FromFile(fileN);

Image imgThumb = image.GetThumbnailImage(100, 100, null, new IntPtr());

imageList1.Images.Add(imgThumb);

image.Dispose();

listView1.LargeImageList = imageList1;

Теперь вы можете удалить файл:

File.Delete(FileN);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top