今天在一个群里,遇到一个别人问的问题,代码如下所示,项目本意是想在窗体加载时显示一张图片,然后点击按钮,删除该图片。
可是如下代码,在点击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); } }