用怪异的眼光去研究
亮.net
博客园
首页
新随笔
新文章
联系
订阅
管理
posts - 24,comments - 60,trackbacks - 5
<
2006年8月
>
日
一
二
三
四
五
六
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
7
8
9
与我联系
发短消息
搜索
常用链接
我的随笔
我的空间
我的短信
我的评论
更多链接
我的参与
我的新闻
最新评论
我的标签
留言簿
(4)
给我留言
查看留言
我参与的团队
北京.NET俱乐部(0/1483)
ASP.NET AJAX (Atlas)学习(0/1347)
Windows Vista开发(0/235)
我的标签
iSCSI
(3)
存储
(3)
IET
(2)
配置
(2)
Linux
(2)
RHEL4
(1)
服务
(1)
安装
(1)
攻略
(1)
target
(1)
更多
随笔分类
.net FrameWork(11)
.net IL学习
.net 控件收集(2)
ASP.net(12)
ISCSI与存储技术(3)
Java Script 方面~(2)
Linux点滴(3)
Vista(2)
Windows Mobile
XML&Web Service
管理(1)
业内...(1)
运维与运营工作(1)
随笔档案
2008年7月 (1)
2008年3月 (3)
2007年11月 (2)
2007年8月 (3)
2007年5月 (2)
2007年4月 (3)
2007年2月 (2)
2007年1月 (1)
2006年11月 (2)
2006年10月 (2)
2006年9月 (1)
2006年8月 (1)
相册
昌黎黄金海岸
我的头像
吝蛋是美德
积分与排名
积分 - 14904
排名 - 2486
最新随笔
1. 生成短GUID的两个方法
2. ISCSI Enterprise Target 的其他资源和地址
3. RHEL 4 下 ISCSI Enterprise Target 的常用配置和常用操作
4. RedHat Enterprise 4 as4 ISCSI Target 网络存储服务器安装攻略
5. javascript 收集
6. 按键相关的 JS脚本代码
7. 对指定的网页进行截图 C#版
8. [无敌]一些web开发中常用的、做成cs文件的js代码 - 转帖来的
9. Google 巨强的代码搜索引擎静悄悄的推出?
10. 在Module中使用自定义过滤器,来统一对站内所有请求响应的输出内容进行采集或更改。
最新评论
1. re: ISCSI Enterprise Target 的其他资源和地址
没有 了,请再上传一份吧
--试验
2. re: 对指定的网页进行截图 C#版
要截取百度的怎么没有半点反应。。。
--啊丁
阅读排行榜
1. 在Module中使用自定义过滤器,来统一对站内所有请求响应的输出内容进行采集或更改。(2714)
2. 在.net 中依据页的角色验证方式产生相匹配的菜单(2109)
3. Vista 下的注册 com 类失败解决方法(1113)
4. DotNetBar 6.6.0.4 for Vs2005 (+特殊补丁)(865)
5. AjaxPro.NET框架生成高效率的Tree(Asp.net 2.0)(示例代码下载) (653)
评论排行榜
1. 在Module中使用自定义过滤器,来统一对站内所有请求响应的输出内容进行采集或更改。(11)
2. Image 类使用中的奇怪问题及解决办法(9)
3. DotNetBar 6.6.0.4 for Vs2005 (+特殊补丁)(9)
4. 在.net 中依据页的角色验证方式产生相匹配的菜单(8)
5. 对指定的网页进行截图 C#版(8)
Image 类使用中的奇怪问题及解决办法
近日写一站点
需要一个这样的过程:
服务器指定目录中存在一些图片。
站点程序读取图片存入数据库并删除源图片。
代码如下:
public
static
Photo ReadImage(
string
ImageFilePath)
{
//
设置图片私有变量和属性。
Photo photo
=
new
Photo();
//
读取图片文件
photo.TheImage
=
System.Drawing.Image.FromFile(ImageFilePath);
//
图片文件大小
photo.ImageLength
=
new
FileInfo(ImageFilePath).Length;
photo.ImageFileName
=
GetFileName(ImageFilePath);
photo.ImageType
=
GetFileExtName(ImageFilePath);
//
删除原文件
File.Delete(ImageFilePath);
return
Photo;
}
可在这个函数执行中,发现有很严重的问题,图片源文件无法删除。
提示错误如下:
文件“E:\SUNBOY\\temp\bd8df21a-5ff9-4dd8-aff8-6feb5d2b1f85\test.jpg”正由另一进程使用,因此该进程无法访问该文件。
乍一看,这段代码应该是没问题的,怎么会出这样的错误呢?(我保证文件在进入这段代码前是不会被使用的)
通过把 File.Delete(ImageFilePath); 放在
//
读取图片文件
photo.TheImage
=
System.Drawing.Image.FromFile(ImageFilePath);
只前,之后的比较发现,罪魁祸首是System.Drawing.Image.FromFile(ImageFilePath);
很显然,System.Drawing.Image.FromFile 函数在读取图片后,并没有关闭掉文件。
跟平时编程的常识好象有些出入。
例如:photo.ImageLength
=
new
FileInfo(ImageFilePath).Length;
经过测试发现,使用FileInfo 类获得文件的大小后,文件就被关闭了。
很奇怪,不知道这里是bug 呢,还是刻意的。
没办法,只好自己考虑了解决方法:
读取文件流,使用System.Drawing.Image.FromStream 方法。
这样就可以自己操作文件,自己进行关闭了。
经过测试,这样是可行的,不过不知道效率如何!
代码如下:
public
static
Photo ReadImage(
string
ImageFilePath)
{
//
设置图片私有变量和属性。
Photo photo
=
new
Photo();
FileStream fs
=
new
FileStream(ImageFilePath, FileMode.Open);
BinaryReader br
=
new
BinaryReader(fs);
byte
[] bytes
=
br.ReadBytes((
int
)fs.Length);
br.Close();
fs.Close();
MemoryStream ms
=
new
MemoryStream(bytes);
photo.TheImage
=
System.Drawing.Image.FromStream(ms);
photo.ImageLength
=
new
FileInfo(ImageFilePath).Length;
photo.ImageFileName
=
GetFileName(ImageFilePath);
photo.ImageType
=
GetFileExtName(ImageFilePath);
File.Delete(ImageFilePath);
return
Photo;
}
posted on 2006-08-16 12:58
李佩亮
阅读(630)
评论(9)
编辑
收藏
所属分类:
.net FrameWork
FeedBack:
#1楼
2006-08-16 21:32 |
fzl [未注册用户]
不错不错,看来楼主对流的操作挺熟练,我问一个问题啊,现在有一个长度不定的流过来(一定是一个Stream对象),我现在想用byte[]数组来操作它,可是我不知道byte数组应该声明多长(因为Stream对象的实例的Length属性一获取就报错,我就晕了)!多谢楼主
回复
引用
#2楼
2006-08-16 22:19 |
fzl [未注册用户]
恕我眼浊,方才没有看仔细,谢谢楼主!问题已经解决
回复
引用
#3楼
2006-08-16 23:41 |
fzl [未注册用户]
使用过程中又发现问题了,还是那个Stream的,刚才一激动把你的FileStream当成Stream类了!我现在有个对象返回的是Stream对象,而不是FileStream(不能转换成这个)
回复
引用
#4楼
2006-08-17 10:34 |
.Live
我也碰到过这个问题,Image和Bitmap对象打开图像文件都会锁定磁盘文件的,但好像也没有提供解锁的方法。但是将new的对象delete就会自动解锁。我在C++下的解决方法是:
Bitmap pTempBitmap = new Bitmap(ImageFilePath);
Bitmap pBitmap = new Bitmap(
pTempBitmap->GetWidth()
,pTempBitmap->GetHeight()
,pTempBitmap->GetPixelFormat()
);
Graphics g(pBitmap);
g.DrawImage(tPic,0,0,pTempBitmap->GetWidth(),pTempBitmap->GetHeight());
delete pTempBitmap;
return pBitmap;
这样文件就不会锁定了,不能用Clone,用Clone的话,锁定的文件资源在所有的克隆体delete之前都不会解锁。
回复
引用
查看
#5楼
[
楼主
]
2006-08-17 11:21 |
李佩亮
@fzl
你的 Stream.Length 属性会报什么错误啊?
回复
引用
查看
#6楼
2006-10-26 13:44 |
coos[匿名]
image.Dispose();
回复
引用
查看
#7楼
2006-10-27 11:03 |
闪电侠 [未注册用户]
这个问题我也遇到了,也解决了,因为对象在没有处置前,会被锁定,所以就无法操作了,只要释放掉他就可以了
回复
引用
#8楼
2007-07-14 20:29 |
0123 [未注册用户]
@coos[匿名]
image.Dispose(); 不可以,已经测试过了。
回复
引用
#9楼
2007-10-09 18:25 |
coolflyr_reg [未注册用户]
1楼的那个问题很简单,用字节缓冲,然后将不定长流逐个byte读入字节缓冲
回复
引用
社区
新闻
新用户注册
刷新评论列表
标题
姓名
主页
Email
(只有博主才能看到)
验证码
*
看不清,换一张
[
登录
][
注册
]
内容(请不要发表任何与政治相关的内容)
Remember Me?
登录
使用高级评论
新用户注册
返回页首
恢复上次提交
[使用Ctrl+Enter键可以直接提交]
该文被作者在 2006-11-02 10:45 编辑过
相关文章:
使用Visual Studio2005入门.Net2.0系列视频教程
关于IE问题,请教和求救
Eclipse基础--安装eclipse及语言包
全国县及县以上行政区划代码信息类
tomcat中的几点配置说明
开机音量控制图标无法显示的解决办法
相关链接:
所属分类的其他文章:
生成短GUID的两个方法
对指定的网页进行截图 C#版
在Module中使用自定义过滤器,来统一对站内所有请求响应的输出内容进行采集或更改。
asp.net 中 HttpRequest 中跟URL path 有关的方法和属性
asp.net 生命周期中的时间流程
ASP.NET 网站路径[转载]
.net 对文件设置权限的代码
Vista 下使用Visual Studio 2005 开发Oracle 方面程序出现的数据连结问题及解决方案
Vista 下的注册 com 类失败解决方法
关于String 和 Base64 之间的互转 比较简单!
最新IT新闻:
消息称MySQL创始人已向Sun提交辞呈
谷歌Chrome浏览器即将更换LOGO颜色?
淘宝网合并阿里妈妈 专家称阿里巴巴或有新战略
微软研究院发布 AutoCollage - 整理并融合照片
2008年9月5日科技博客精选
博客园新闻频道
博客园首页
社区