首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > Brew >

心得分享,关于IFILEMGR_GetInfo返回EBUFFERTOOSMALL

2012-12-31 
经验分享,关于IFILEMGR_GetInfo返回EBUFFERTOOSMALL本帖最后由 instantboy 于 2010-07-09 19:40:20 编辑在

经验分享,关于IFILEMGR_GetInfo返回EBUFFERTOOSMALL
本帖最后由 instantboy 于 2010-07-09 19:40:20 编辑 在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高手啊,多谢分享!
[解决办法]
谢谢分享
[解决办法]
楼主好人啊。经验分享,还有分散
[解决办法]
好经验,非常感谢楼主的分享
[解决办法]
顶一下,确实如此
[解决办法]
谢谢分享·~学习了

热点排行