博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【转】“正由另一进程使用,因此该进程无法访问该文件”的问题&解决方法
阅读量:5314 次
发布时间:2019-06-14

本文共 1351 字,大约阅读时间需要 4 分钟。

正在写一个手指画图的程序

C# + WPF
其中有一部分是加载外部某PNG文件,放入BitmapImage,再作为Image的Source显示在Canvas上
画了几笔之后,再存回这个PNG文件
================问题=================
BitmapImage这个对象没有Dispose方法,始终无法释放,因此在之后FileStream试图写这个文件时出现“正由另一进程使用,因此该进程无法访问该文件”的问题

BitmapImage bitmap = new BitmapImage();bitmap.BeginInit();bitmap.UriSource = new Uri(filePath);bitmap.EndInit();Image currentImage .Source = bitmap;canvas.Children.Add(currentImage);// Do some modificationprivate void ExportToPng( string path, Canvas surface){if(path == null)return;........using(FileStream outStream = new FileStream(path, FileMode.Create)........}

尝试了很多方法,包括在using FileStream之前加lock、在new FileStream的参数中加入FileAccess.ReadWrite、FileShare.ReadWrite、以及将bitmap.Clone作为currentImage的Source,都不成功

===============解决方法=============
最后发现初始化BitmapImage可以通过byte[]进行,于是只能通过将png文件读成byte[],再进行BitmapImage的初始化,就没有问题了

// Read byte[] from png fileBinaryReader binReader = new BinaryReader(File.Open(filePath, FileMode.Open));FileInfo fileInfo = new FileInfor(filePath);byte[] bytes = binReader.ReadBytes((int)fileInfo.Length);binReader.Close();// Init bitmapBitmapImage bitmap = new BitmapImage();bitmap.BeginInit();bitmap.StreamSource = new MemoryStream(bytes);bitmap.EndInit();

为了更加保险,最后使用的方法中通过ref参数,将需要init的bitmap作为参数传入,方法内部生成一个temp的BitmapImage,完成Init后,bitmap = temp.Clone()

转载于:https://www.cnblogs.com/ZXdeveloper/p/3779755.html

你可能感兴趣的文章
No Launcher activity found!
查看>>
xml序列化派生类
查看>>
Snmp的学习总结(一)
查看>>
MySQL server has gone away报错原因分析
查看>>
突然感觉需要写点什么
查看>>
机器学习 周志华 第1章习题
查看>>
SOAP UI(ReadyAPI)学习——第一步:资源帖
查看>>
oracle 分组查询
查看>>
SQL server 2008 sa 账户设置失败
查看>>
dp小菜数塔
查看>>
assign、retain、copy使用异同
查看>>
算术验证
查看>>
BLE Android开发中的问题
查看>>
关于面试题 的一点看法
查看>>
java项目打jar包
查看>>
●POJ 2828 Buy Tickets
查看>>
多线程(一)
查看>>
SMA2SATA、PCIe2SATA转换模块(也有叫:Sata Test Fixtures)
查看>>
oracle创建、删除账户
查看>>
MySQL性能剖析工具(pt-query-digest)【转】
查看>>