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);
        }

    }

posted @ 2011-02-21 15:23  leco_lin  阅读(4778)  评论(9编辑  收藏  举报