一旦目錄名里出現(xiàn)“.”號,就會(huì)出錯(cuò)。 除了改名字,還有其他方法解決嗎?
(比如做了一個(gè)自動(dòng)按目錄播放的MP3,總不能要求用戶先把目錄名中的點(diǎn)號給去掉吧) (長文件名大概會(huì)沒問題,但目前CH376似乎對LFN支持不是很好)
一旦目錄名里出現(xiàn)“.”號,就會(huì)出錯(cuò)。 除了改名字,還有其他方法解決嗎?
(比如做了一個(gè)自動(dòng)按目錄播放的MP3,總不能要求用戶先把目錄名中的點(diǎn)號給去掉吧) (長文件名大概會(huì)沒問題,但目前CH376似乎對LFN支持不是很好)
1、出什么錯(cuò),代碼是多少? 2、“LFN”是什么意思,對長文件名的處理具體遇到什么問題了?
應(yīng)該不會(huì)出現(xiàn)出錯(cuò)的現(xiàn)象,按照常理來講,在短文件名里面是不允許出現(xiàn)"."這個(gè)字符的,肯定和你軟件處理上面有關(guān)系,對于你來講,打開文件和打開目錄是完全一樣的.
比如我遇到的情況:一個(gè)歌手的專輯名為 No.1 No.2 No.3 然后枚舉后就是得到 No No No 這樣就沒法進(jìn)入子目錄了。
源代碼如是:
/// 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就是長文件名
首先你確認(rèn)No.1這個(gè)文件夾應(yīng)該有一個(gè)短文件名,至于短文件名是什么你可以枚舉出來,還有在判斷是文件還是文件夾的時(shí)候,建議你先打開下文件,如果是文件夾返回0X41,如果是文件返回0X00,或者通過文件的屬性來判斷文件和文件夾,當(dāng)確定是文件夾之后在對文件夾進(jìn)行操作,當(dāng)是文件的時(shí)候?qū)ξ募M(jìn)行操作 程序上面if ((sdir != "RECYCLED") && (sdir != ".") && (sdir != ".."))判斷有點(diǎn)問題,對于.和..只判斷是前2個(gè)字節(jié)就好了,后面的不要判斷。
特地到WIN98下去測試了一下,我錯(cuò)了 原來8.3格式下 目錄名也有后綴! 比如No.1 目錄 后綴為"1"
呵呵,學(xué)DOS時(shí)沒學(xué)好啊