管理员
  
- 积分
- 165475
- 金钱
- 165475
- 注册时间
- 2010-12-1
- 在线时间
- 2115 小时
|
发表于 2014-2-23 23:19:12
|
显示全部楼层
回复【3楼】zhang164534:
---------------------------------
你其实可以去分析源码.
如下:
#if _USE_LFN == 0 /* No LFN feature */
#define DEF_NAMEBUF BYTE sfn[12]
#define INIT_BUF(dobj) (dobj).fn = sfn
#define FREE_BUF()
#elif _USE_LFN == 1 /* LFN feature with static working buffer */
static WCHAR LfnBuf[_MAX_LFN+1];
#define DEF_NAMEBUF BYTE sfn[12]
#define INIT_BUF(dobj) { (dobj).fn = sfn; (dobj).lfn = LfnBuf; }
#define FREE_BUF()
#elif _USE_LFN == 2 /* LFN feature with dynamic working buffer on the stack */
#define DEF_NAMEBUF BYTE sfn[12]; WCHAR lbuf[_MAX_LFN+1]
#define INIT_BUF(dobj) { (dobj).fn = sfn; (dobj).lfn = lbuf; }
#define FREE_BUF()
#elif _USE_LFN == 3 /* LFN feature with dynamic working buffer on the heap */
#define DEF_NAMEBUF BYTE sfn[12]; WCHAR *lfn
#define INIT_BUF(dobj) { lfn = ff_memalloc((_MAX_LFN + 1) * 2); \
if (!lfn) LEAVE_FF((dobj).fs, FR_NOT_ENOUGH_CORE); \
(dobj).lfn = lfn; (dobj).fn = sfn; }
#define FREE_BUF() ff_memfree(lfn)
结合源码,再看作者的注释:
/ 0: Disable LFN feature. _MAX_LFN and _LFN_UNICODE have no effect.
/ 1: Enable LFN with static working buffer on the BSS. Always NOT reentrant.
/ 2: Enable LFN with dynamic working buffer on the STACK.
/ 3: Enable LFN with dynamic working buffer on the HEAP.
0,当然就是不支持长文件名了,节省空间.
1,支持长文件名,但不支持重入.
2,支持长文件名,工作区存放在STACK,也就是死数组里面.
3,支持长文件名,工作区采用动态内存管理,存放在HEAP,也就是必须实现动态内存管理.
当然方法3是最好的了.不用开个死数组,占茅坑.
1,就像你出门在外,没有厕所可以用,只能就地解决.当然这个时候,你绝对不会希望你上厕所的时候,别人也来上.
2,就像你有个固定的厕所了,基本只能自己用用,偶尔也可以给别人用.
3,就像公共厕所,不止你能用,大家都能用. |
|