Процесс не может получить доступ к файлу, так как этот файл используется другим процессом

208
04 июня 2018, 06:50

Всем доброго времени суток.

Возникла следующая проблема: На форме есть ListBox, в данный ListBox, я добавляю итемы в виде "Картинка+Текст":

<ListBox Name="lstTest">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal" Height="50">
                <Image Name="imgTest" Height="24" Width="24" Margin="0" Source="{Binding path_img}"/>
                <TextBlock Name="txtTest" Margin="5, 15, 0, 0" Text="{Binding nameTest}"/>
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

Добавляю итемы следующим образом:

lstTest.Items.Add(new DirectoryListing() { path_img = System.Windows.Forms.Application.StartupPath + "\\Test\\favicon.png", nameTest= "Тестовый итем" });

Класс "DirectoryListing" выглядит следующим образом:

public partial class DirectoryListing
{
    public string path_img { get; set; }
    public string nameTest { get; set; }
}

И собственно, вся суть проблемы в том, что при попытки удалить всю папку с картинкой (предварительно удалив Итем из ListBox) возникает ошибка - "Процесс не может получить доступ к файлу "favicon.png", так как этот файл используется другим процессом."

Удалить я пытаюсь следующим образом:

foreach (DirectoryListing di in lstTest.Items)
{
    if (di == lstTest.SelectedItem)
    {
        di.nameTest= null;
        di.path_img = null;
        lstTest.Items.Remove(lstTest.SelectedItem);
        di.Dispose();
        break;
    }
}
FileSystem.DeleteDirectory(System.Windows.Forms.Application.StartupPath + "\\Test", DeleteDirectoryOption.DeleteAllContents);

Суть то мне ясна, что нужно как то освободить этот файл картинки от моей программы, но как это сделать?

Answer 1

Чтобы получить нужное поведение, вам придётся использовать загрузку изображения в память вместо использования URI.

Например, вот так:

var bitmap = BitmapFrame.Create(
memoryStream, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.OnLoad);
 image.Source = bitmap; // image - ваш Image из разметки

Ключевое здесь - BitmapCacheOption.OnLoad. Этот флаг заставляет WPF загрузить данные в память и освободить ресурс.

Можно добавлять полученные битмапы в лист и биндить также, как делаете вы. Остаётся только загрузить данные в MemoryStream.

READ ALSO
Геолокация в C#

Геолокация в C#

Какие есть способы получить долготу и широту устройства в C#? Я пробовал с помощью GeoCoordinateWatcher, но тщетноДелал всё как по книжке, но в итоге...

284
Как обработать событие в webbrowser только 1 раз? - C#

Как обработать событие в webbrowser только 1 раз? - C#

Подскажите пожалуйста как обработать событие только 1 раз? Обрабатывается один раз потому-что при клике на элемент вылазиет еще модальное...

228
Можно ли сделать так,чтобы спрайт отображался поверх объекта либо исчезал со сцены на время их пересечения?

Можно ли сделать так,чтобы спрайт отображался поверх объекта либо исчезал со сцены на время их пересечения?

Проблема состоит в том,что healthBar это UI объект (слайдер) и он перекрывает спрайт летящего самолета

226
Как в c# выбрать нужные ячейки из Excel?

Как в c# выбрать нужные ячейки из Excel?

В общем, есть документ excel в котором есть 2 нужных столбцаСтолбцы с данными от J7 до n и от K7 до n

176