想根目錄枚舉 .BIN 文件。 第一次插入U(xiǎn)盤枚舉正確,重新插入U(xiǎn)盤后,枚舉就不正確了,可能出現(xiàn)同一個(gè)文件被枚舉了多次的現(xiàn)象,或者枚舉出一個(gè) \ 文件。 幾乎每次都是這樣。不知道為什么,請(qǐng)教了。
FileBinData.Num 為BIN文件個(gè)數(shù) FileNameBuffer[FileBinData.Num].BINNAME[a] 保存文件名 最后在液晶屏上顯示 代碼如下 : //索引根目錄 bool ListRoot(void) { UINT8 s; P_FAT_DIR_INFO pDir;
FileBinData.Num = 0; /* 讀取原文件 */ strcpy( buf, "\\" ); /* C51子目錄不存在則列出根目錄下的文件 */ DbgPrint( PSW_USB,"List file %s\n", buf ); CH376FileOpenPath( buf ); /* 枚舉多級(jí)目錄下的文件或者目錄,輸入緩沖區(qū)必須在RAM中 */
CH376FileClose( FALSE ); /* 對(duì)于根目錄一定要關(guān)閉 */ CH376WriteVar32( VAR_START_CLUSTER, 0 ); /* 當(dāng)前目錄的起始簇號(hào),相當(dāng)于打開(kāi)當(dāng)前目錄 */ CH376SetFileName( "*" ); /* 設(shè)置將要操作的文件的文件名,通配符支持所有文件和子目錄 */
xWriteCH376Cmd( CMD0H_FILE_OPEN ); /* 枚舉文件和目錄 */ s = Wait376Interrupt( ); if(s!=USB_INT_DISK_READ) { //報(bào)錯(cuò) mStopIfError(s); return FALSE; }
while ( s == USB_INT_DISK_READ ) { /* 枚舉到匹配的文件 */ CH376ReadBlock( buf ); pDir = (P_FAT_DIR_INFO)buf; /* 當(dāng)前文件目錄信息 */ if ( pDir -> DIR_Name[0] != '.' ) { /* 不是本級(jí)或者上級(jí)目錄名則繼續(xù),否則必須丟棄不處理 */ if ( pDir -> DIR_Name[0] == 0x05 ) pDir -> DIR_Name[0] = 0xE5; if (pDir -> DIR_Name[8] == 'B' && pDir -> DIR_Name[9] == 'I' && pDir -> DIR_Name[10] == 'N' ) { DbgPrint( PSW_USB,"This is .BIN file\n" ); uint8 a = 0; for ( s = 0; s < 11; s ++ ) { /* 復(fù)制文件名,長(zhǎng)度為11個(gè)字符 */ if ( pDir->DIR_Name[s] != 0x20 ) { /* 有效字符 */ if ( s == 8 ) { /* 處理擴(kuò)展名 */ FileNameBuffer[FileBinData.Num].BINNAME[a++] = '.'; /* 分隔符 */ FileNameBuffer[FileBinData.Num].BINNAME[a++] = pDir->DIR_Name[s]; } else { FileNameBuffer[FileBinData.Num].BINNAME[a++] = pDir->DIR_Name[s]; } } } FileBinData.Num++; } pDir -> DIR_Attr = 0; /* 強(qiáng)制文件名字符串結(jié)束以便打印輸出 */ DbgPrint( PSW_USB, "*** EnumName: %s\n", pDir -> DIR_Name ); } xWriteCH376Cmd( CMD0H_FILE_ENUM_GO ); /* 繼續(xù)枚舉文件和目錄 */ // xEndCH376Cmd( ); s = Wait376Interrupt( ); } return TRUE; }
每次都是液晶屏顯示重復(fù)的BIN文件,或者\(yùn)文件。第一次都沒(méi)錯(cuò)