How can I release the handle on this file?
img is of type 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. }
Solution
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; }
Found the answer on MSDN Forum.
Bitmap stream is not closed unless caching option is set as BitmapCacheOption.OnLoad. So you need something like this:
public static ImageSource BitmapFromUri(Uri source) { var bitmap = new BitmapImage(); bitmap.BeginInit(); bitmap.UriSource = source; bitmap.CacheOption = BitmapCacheOption.OnLoad; bitmap.EndInit(); return bitmap; }
And when you get an ImageSource using the method above, source file will be immediately closed.
see MSDN social forum
I kept running into issues with this on a particularly troubling image. The accepted answer did not work for me.
Instead, I used a stream to populate the bitmap:
using (FileStream fs = new FileStream(path, FileMode.Open)) { bitmap.BeginInit(); bitmap.StreamSource = fs; bitmap.CacheOption = BitmapCacheOption.OnLoad; bitmap.EndInit(); }
This caused the file handle to be released.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With