izz moe Ответов: 2

Как удалить изображение, пока оно находится в listview?


Я пытаюсь сделать этот вид списка, который показывает изображения в папке
<prelang="c#">
общественного недействительными метод loadData()
{

var imgList = каталог.Заражен(каталоге directorypath, "*.в JPG", searchoption указывает, нужно.AllDirectories);
myListView.ItemsSource = imgList;

}


Шаблон элемента управления ListView, изображение и кнопку, чтобы удалить изображение
Событие щелчка кнопки обрабатывается следующим образом
private void DeleteImg(object sender, RoutedEventArgs e)
        {
            
            string delImg = (string)(sender as Button).DataContext;
            File.Delete(delImg);
            LoadData();
        }


При попытке удалить изображение я получаю следующую ошибку

System.IO.IOException: "процесс не может получить доступ к файлу "xyz", потому что он используется другим процессом".

xyz это имя файла очевидно

Я думаю, это потому, что изображение открыто в ListView
Есть идеи, как я могу закрыть файл перед его удалением

Что я уже пробовал:

Я пытался
myListView.ItemsSource = null;
myListView.Предметы.Четкий();
тоже:
Системы.ГК.Собирать();
System.GC.WaitForPendingFinalizers();

2 Ответов

Рейтинг:
7

izz moe

Спасибо Вам Гарт Джей Ланкастер за ответ;

Я наконец нашел это решение после нескольких часов поисков

public void LoadData()
{

var imgList = Directory.GetFiles(directoryPath, "*.jpg", SearchOption.AllDirectories);
myListView.ItemsSource = imgList;
foreach (string f in imgList)
            {

                var bi = new BitmapImage();
                bi.BeginInit();
                bi.CacheOption = BitmapCacheOption.OnLoad;
                bi.UriSource = new Uri(f);
                imgLister.Add(bi);
                bi.EndInit();
                bi.Freeze();
            }
}


Метод Freeze() освобождает память и позволяет удалить файл


Рейтинг:
0

Garth J Lancaster

Ну, вы не можете удалить файл, который используется (если это действительно ваша программа, которая заблокировала его, я бы проверил что-то вроде Проводник Процессов - Windows Sysinternals | Microsoft Docs[^] чтобы посмотреть, кто им пользуется .... )

Итак, я вижу 2 варианта ...
1) вы "ставите в очередь" файлы, которые хотите удалить, возможно, записываете их имена в текстовый файл, когда ваша программа выходит, вы создаете быструю программу для чтения содержимого текстового файла, являющегося полными именами файлов изображений, и удаляете их
2) я не уверен, как ваша программа загружает изображения, но я бы сгенерировал ноготь большого пальца в памяти изображения и использовал его в listview, чтобы вы не блокировали исходный "мастер" на диске

Интересно что как вы уже пробовали,

myListView.ItemsSource = null;
myListView.Items.Clear();
не работает, это была моя первая мысль, очистить listview и ?тогда блокировка исчезнет, но есть, очевидно, что-то, что я не могу вспомнить об использовании listview/изображений