Не удается удалить файл изображения, отображаемый в виде списка - PullRequest
4 голосов
/ 21 апреля 2010

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

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

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

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

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

Спасибо!

Ответы [ 3 ]

6 голосов
/ 21 апреля 2010

Вам необходимо загрузить файл в MemoryStream, например:

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

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

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

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

using (var image = Image.FromFile(fileInfo.FullName))
    imageList.Images.Add(image);
1 голос
/ 21 апреля 2010

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

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

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

0 голосов
/ 15 мая 2015

Используйте 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...