CH376目录名和文件名问题

一旦目录名里出现“.”号,就会出错。 除了改名字,还有其他方法解决吗?

(比如做了一个自动按目录播放的MP3,总不能要求用户先把目录名中的点号给去掉吧) (长文件名大概会没问题,但目前CH376似乎对LFN支持不是很好)

1、出什么错,代码是多少? 2、“LFN”是什么意思,对长文件名的处理具体遇到什么问题了?


应该不会出现出错的现象,按照常理来讲,在短文件名里面是不允许出现"."这个字符的,肯定和你软件处理上面有关系,对于你来讲,打开文件和打开目录是完全一样的.


比如我遇到的情况:一个歌手的专辑名为 No.1 No.2 No.3 然后枚举后就是得到 No No No 这样就没法进入子目录了。

源代码如是:

/// CMD_RD_USB_DATA0 max data length is 255 //vector vcu8; //vcu8.reserve(256); static U8 vcu8[255];

if(CH376FileOpenPath((gi.cdir + '*').c_str()) == USB_INT_DISK_READ) { FILEMORE: /* read FAT_DIR_INFO , size is sizeof(FAT_DIR_INFO) */ CH376ReadBlock(&vcu8[0]); P_FAT_DIR_INFO pDir = (P_FAT_DIR_INFO)&vcu8[0];

/* 特殊字符替换 */ if(pDir->DIR_Name[0] == 0x05) pDir->DIR_Name[0] = 0xE5;

if (pDir->DIR_Attr & ATTR_DIR) { string sdir;

for(int s = 0; s < 8; s++) { if(pDir->DIR_Name[s] != 0x20) sdir += pDir->DIR_Name[s]; }

if ((sdir != "RECYCLED") && (sdir != ".") && (sdir != "..")) { sdir += '\\'; gi.vdn.push_back(sdir); } } else { string sfn, sext; int s;

for(s=0; s<8; s++) { if(pDir->DIR_Name[s] != 0x20) sfn += pDir->DIR_Name[s]; } for(; s<11; s++) { if(pDir->DIR_Name[s] != 0x20) sext += pDir->DIR_Name[s]; }

if (ExtNameCheck(sext)) { gi.vfn.push_back(sfn + '.' + sext); } }

xWriteCH376Cmd(CMD0H_FILE_ENUM_GO); xEndCH376Cmd();

if(USB_INT_DISK_READ == Wait376Interrupt()) goto FILEMORE; }[font=Lucida Console]文字[/font]


上贴已修改格式,请删除本贴。

---- 格式不好,再贴一下: /// CMD_RD_USB_DATA0 max data length is 255 //vector vcu8; //vcu8.reserve(256); static U8 vcu8[255];

if(CH376FileOpenPath((gi.cdir + '*').c_str()) == USB_INT_DISK_READ) { FILEMORE: /* read FAT_DIR_INFO , size is sizeof(FAT_DIR_INFO) */ CH376ReadBlock(&vcu8[0]); P_FAT_DIR_INFO pDir = (P_FAT_DIR_INFO)&vcu8[0];

/* 特殊字符替换 */ if(pDir->DIR_Name[0] == 0x05) pDir->DIR_Name[0] = 0xE5;

if (pDir->DIR_Attr & ATTR_DIR) { string sdir;

for(int s = 0; s < 8; s++) { if(pDir->DIR_Name[s] != 0x20) sdir += pDir->DIR_Name[s]; }

if ((sdir != "RECYCLED") && (sdir != ".") && (sdir != "..")) { sdir += '\\'; gi.vdn.push_back(sdir); } } else { string sfn, sext; int s;

for(s=0; s<8; s++) { if(pDir->DIR_Name[s] != 0x20) sfn += pDir->DIR_Name[s]; } for(; s<11; s++) { if(pDir->DIR_Name[s] != 0x20) sext += pDir->DIR_Name[s]; }

if (ExtNameCheck(sext)) { gi.vfn.push_back(sfn + '.' + sext); } }

xWriteCH376Cmd(CMD0H_FILE_ENUM_GO); xEndCH376Cmd();

if(USB_INT_DISK_READ == Wait376Interrupt()) goto FILEMORE; }


嗯。 LFN就是长文件名


首先你确认No.1这个文件夹应该有一个短文件名,至于短文件名是什么你可以枚举出来,还有在判断是文件还是文件夹的时候,建议你先打开下文件,如果是文件夹返回0X41,如果是文件返回0X00,或者通过文件的属性来判断文件和文件夹,当确定是文件夹之后在对文件夹进行操作,当是文件的时候对文件进行操作 程序上面if ((sdir != "RECYCLED") && (sdir != ".") && (sdir != ".."))判断有点问题,对于.和..只判断是前2个字节就好了,后面的不要判断。


特地到WIN98下去测试了一下,我错了 原来8.3格式下 目录名也有后缀! 比如No.1 目录 后缀为"1"

呵呵,学DOS时没学好啊

201022217402933.bmp


只有登录才能回复,可以选择微信账号登录