经验分享,关于IFILEMGR_GetInfo返回EBUFFERTOOSMALL

instantboy 2010-07-09 07:39:53
在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,那么需要程序员手动处理一下,否则有可能会发生内存问题。

...全文
1677 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Ending 2010-08-10
  • 打赏
  • 举报
回复
谢谢分享·~学习了
mutouji 2010-08-09
  • 打赏
  • 举报
回复
顶一下,确实如此
FLYUP_CHEN 2010-08-07
  • 打赏
  • 举报
回复
好经验,非常感谢楼主的分享
xcj_ysu 2010-08-05
  • 打赏
  • 举报
回复
楼主好人啊。经验分享,还有分散
nuist320 2010-07-12
  • 打赏
  • 举报
回复
谢谢分享
songj2me 2010-07-10
  • 打赏
  • 举报
回复
LZ高手啊,多谢分享!

2,853

社区成员

发帖
与我相关
我的任务
社区描述
本论坛以AI、WoS 、XR、IoT、Auto、生成式AI等核心板块组成,为开发者提供便捷及高效的学习和交流平台。 高通开发者专区主页:https://qualcomm.csdn.net/
人工智能物联网机器学习 技术论坛(原bbs) 北京·东城区
社区管理员
  • csdnsqst0050
  • chipseeker
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧