欢迎来到Doc100.Net免费学习资源知识分享平台!
您的位置:首页 > 程序异常 >

心得分享,关于ifilemgr_getinfo返回ebuffertoosmall

更新时间: 2014-01-05 02:45:34 责任编辑: Author_N1

 

经验分享,关于IFILEMGR_GetInfo返回EBUFFERTOOSMALL
在Brew315的模拟器上,对一个文件路径,比如” fs:/~/mythroad/b/abcdefghijklmnopqrstuvwxyz1234567890.txt”进行IFileMgr_GetInfo,发现失败,获取错误码为38,查询得到EBUFFERTOOSMALL。
第一想法是文件名长度打过64,但去STRLEN一下后发现长度只有57,觉得很奇怪。
思考后找到原因:
我们的文件路径fs:/~/,在Brew的文件系统里其实会被展开的(我的应用的名字是skyvm),展开后为:
fs:/mod/skyvm/mythroad/b/abcdefghijklmnopqrstuvwxyz1234567890.txt
这个字符串的STRLEN为65,所以也就超出了长度,返回EBUFFERTOOSMALL就在情理中了。

然后我试着将文件名改为abcdefghijklmnopqrstuvwxyz123456789.txt(少了一个末尾的0),也就是说,整个字符串展开后的长度为64,再去IFileMgr_GetInfo,得到的结果是257,查询为“File does not exist”,这个也有点奇怪,但是仔细想想:brew内部应该是用一个64字节的数组来存储文件名的,你给他一个长度为64的字符串,肯定是能容纳的,但是我觉得他在去打开这个文件的时候,又会做为一个PSTR去使用,也就是说,需要末尾的0,但是,我这个长度已经是64了,末尾的0没有了,那么系统实际获得的文件名就是abcdefghijklmnopqrstuvwxyz123456789.txt在加上一些后面的随机内存,那么这个文件不存在就在情理之中了。

果然,我把这个文件名再减少一个字符,就OK了

这个事情告诉我们两点:
1) brew的最长文件名限制是对最终的展开后的路径的长度(如果你的文件包含fs:/~/)
2) 如果展开后的文件名长度是64,那么需要程序员手动处理一下,否则有可能会发生内存问题。


--参考方法--
LZ高手啊,多谢分享!
--参考方法--
谢谢分享
--参考方法--
楼主好人啊。经验分享,还有分散
--参考方法--
好经验,非常感谢楼主的分享
--参考方法--
顶一下,确实如此
--参考方法--
谢谢分享·~学习了
上一篇:上一篇
下一篇:下一篇

 

随机推荐程序问答结果

 

 

如对文章有任何疑问请提交到问题反馈,或者您对内容不满意,请您反馈给我们DOC100.NET论坛发贴求解。
DOC100.NET资源网,机器学习分类整理更新日期::2014-01-05 02:45:34
如需转载,请注明文章出处和来源网址:http://www.doc100.net/bugs/t/14006/
本文WWW.DOC100.NET DOC100.NET版权所有。