zoukankan      html  css  js  c++  java
  • WPF BitmapImage 图片资源无法删除,文件正在被另一个进程使用

    今天在一个群里,遇到一个别人问的问题,代码如下所示,项目本意是想在窗体加载时显示一张图片,然后点击按钮,删除该图片。

    可是如下代码,在点击delete按钮时,项目报异常:“...无法删除,文件正在被另一个进程使用”,

    xaml 代码:
         <Grid x:Name="LayoutRoot">
            <Grid.RowDefinitions>
                <RowDefinition/>
                <RowDefinition/>
            </Grid.RowDefinitions>
            <Button  Grid.Row="1" Click="Button_Click" Content="Delete" Margin="212,16,183,58" />
        </Grid>
       
    C#代码
        public partial class MainWindow : Window
        {
            string filePath = @"D:\11.图片\6.jpg";
            Image image;
            BitmapImage bitmapImage;
            public MainWindow()
            {
                InitializeComponent();
                image=new Image();
                bitmapImage = new BitmapImage(new Uri(filePath, UriKind.Absolute));
                image.Source=bitmapImage;
                this.LayoutRoot.Children.Add(image);
            }
            private void Button_Click(object sender, RoutedEventArgs e)
            {
                this.LayoutRoot.Children.Remove(image);
                File.Delete(filePath); //这里出现异常
            }
        }
    

    查了一些资料,这个异常的根本原因是因为BitmapImage没有Dispose()方法,系统虽然删除了image,但是图片文件仍然被当前进程占用着。

    于是,将源代码修改如下解决(不再给BitmapImage直赋filePath,而是先根据filePath读取图片的二进制格式,赋给BitmapImage的Source,这样就可以在图片读取完毕后关闭流)。

    解决后的代码如下:

        public partial class MainWindow : Window
        {
            string filePath = @"D:\11.图片\6.jpg";
    
            BitmapImage bitmapImage;
            Image image;
    
            public MainWindow()
            {
                InitializeComponent();
                this.InitImage();           
            }
    
            private void InitImage()
            {
                using (BinaryReader reader = new BinaryReader(File.Open(filePath, FileMode.Open)))
                {
                    FileInfo fi = new FileInfo(filePath);
                    byte[] bytes = reader.ReadBytes((int)fi.Length);
                    reader.Close();
    
                    image = new Image();
                    bitmapImage = new BitmapImage();
                    bitmapImage.BeginInit();
                    bitmapImage.StreamSource = new MemoryStream(bytes);
                    bitmapImage.EndInit();
                    bitmapImage.CacheOption = BitmapCacheOption.OnLoad;
                    image.Source = bitmapImage;                
                    this.LayoutRoot.Children.Add(image);
                }
            }
    
    
            private void Button_Click(object sender, RoutedEventArgs e)
            {
                this.LayoutRoot.Children.Remove(image);
                File.Delete(filePath);
            }
    
        }
    
    
    你好,这是 Leco's 开发笔记,转载请注明出处:http://www.cnblogs.com/leco
  • 相关阅读:
    Java 学习笔记- classpath classpath*
    Java this关键字 学习笔记
    Java 基础 类加载器和双亲委派机制 学习笔记
    《Java语言实现快速幂取模》
    《2017年内蒙古自治区第十二届大学生程序设计-超级密码》
    《快速排序》
    《01-背包问题-点菜》
    微信小程序相关二、css介绍,菜单制作,表单相关,京东注册页面
    微信小程序相关一、模仿京东静态登录页面
    分别用js和css实现瀑布流
  • 原文地址:https://www.cnblogs.com/leco/p/1959781.html
Copyright © 2011-2022 走看看