Отпустите дескриптор в файле. ImageSource из BitmapImage
Как я могу освободить дескриптор этого файла?
img имеет тип System.Windows.Controls.Image
private void Load()
{
ImageSource imageSrc = new BitmapImage(new Uri(filePath));
img.Source = imageSrc;
//Do Work
imageSrc = null;
img.Source = null;
File.Delete(filePath); // File is being used by another process.
}
Решение
private void Load()
{
ImageSource imageSrc = BitmapFromUri(new Uri(filePath));
img.Source = imageSrc;
//Do Work
imageSrc = null;
img.Source = null;
File.Delete(filePath); // File deleted.
}
public static ImageSource BitmapFromUri(Uri source)
{
var bitmap = new BitmapImage();
bitmap.BeginInit();
bitmap.UriSource = source;
bitmap.CacheOption = BitmapCacheOption.OnLoad;
bitmap.EndInit();
return bitmap;
}
Ответы
Ответ 1
Нашел ответ на форуме MSDN.
Потоковый поток не закрывается, если параметр кеширования не установлен как BitmapCacheOption.OnLoad. Поэтому вам нужно что-то вроде этого:
public static ImageSource BitmapFromUri(Uri source)
{
var bitmap = new BitmapImage();
bitmap.BeginInit();
bitmap.UriSource = source;
bitmap.CacheOption = BitmapCacheOption.OnLoad;
bitmap.EndInit();
return bitmap;
}
И когда вы получаете ImageSource, используя метод выше, исходный файл будет немедленно закрыто.
см. социальный форум MSDN
Ответ 2
У меня все время возникали проблемы с этим особенно тревожным изображением. Принятый ответ не сработал у меня.
Вместо этого я использовал поток для заполнения растрового изображения:
using (FileStream fs = new FileStream(path, FileMode.Open))
{
bitmap.BeginInit();
bitmap.StreamSource = fs;
bitmap.CacheOption = BitmapCacheOption.OnLoad;
bitmap.EndInit();
}
Это вызвало освобождение дескриптора файла.