当前位置: 代码迷 >> Brew >> 心得分享,关于IFILEMGR_GetInfo返回EBUFFERTOOSMALL
  详细解决方案

心得分享,关于IFILEMGR_GetInfo返回EBUFFERTOOSMALL

热度:1086   发布时间:2016-04-25 06:58:46.0
经验分享,关于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高手啊,多谢分享!
------解决思路----------------------
谢谢分享
------解决思路----------------------
楼主好人啊。经验分享,还有分散
------解决思路----------------------
好经验,非常感谢楼主的分享
------解决思路----------------------
顶一下,确实如此
------解决思路----------------------
谢谢分享·~学习了
  相关解决方案