CH375讀長文件名文件問題

您好,貴公司提供的讀u盤長文件名文件的例子exam11中: /*讀取指定短文件名的長文件名,返回長文件名在長文件名空間*/ UINT8 mLookUpLName(){ UINT8 BlockSer1; /*定義兩個扇區(qū)塊內(nèi)記數(shù)*/ unsigned char xdata ParData[MAX_PATH_LEN]; /**/ UINT16 tempSec; /*扇區(qū)偏移*/ UINT8 a,i,j,x,k,sum; F_LONG_NAME xdata *pLDirName; P_FAT_DIR_INFO pDirName; bit FBuf; unsigned char xdata *pBuf; unsigned int xdata *pBuf1; for(k=0;k!=MAX_PATH_LEN;k++)ParData[k]=mCmdParam.Other.mBuffer[k]; /**/ i=mChkName(&j); if ( i == ERR_SUCCESS ) { /* 成功獲取上級目錄的起始簇號 */ BlockSer1=0; FBuf=0; /*初始化*/ tempSec=0; while(1){ /*下面是讀取并分析目錄項*/ pDirName=FBuf?FILE_DATA_BUF_ADDR1:FILE_DATA_BUF_ADDR; /*短文件名指針指向緩沖區(qū)*/ mCmdParam.ReadX.mSectorCount=1; /*讀取一扇區(qū)數(shù)據(jù)*/ mCmdParam.ReadX.mDataBuffer=FBuf?FILE_DATA_BUF_ADDR1:FILE_DATA_BUF_ADDR; /*當前處理的文件緩沖區(qū),這里使用雙向緩沖區(qū),去處理文件名*/ FBuf=!FBuf; /*緩沖區(qū)標志翻轉(zhuǎn)*/ i=CH375FileReadX( ); if(i!=ERR_SUCCESS)goto XFF; if(mCmdParam.ReadX.mSectorCount==0){k=16;break;} /*表示沒有數(shù)據(jù)讀出*/ tempSec+=1; /*扇區(qū)記數(shù)加一*/ for(k=0;k!=16;k++){ pBuf=&ParData[j+1]; if(pDirName->DIR_Name[i]==0){k=15;a=1;continue;} /*第一個字節(jié)為0,表示以后沒有有效的目錄項了*/ if(pDirName->DIR_Name[i]==0xe5){pDirName++;continue;} /*第一個字節(jié)為0XE5表示此項被刪除*/ if(pDirName->DIR_Attr==ATTR_VOLUME_ID){pDirName++;continue;} /*為卷標,不分析*/ if(pDirName->DIR_Attr==ATTR_LONG_NAME){pDirName++;continue;} /*為長文件名,不分析*/ for(i=0;i!=8;i++){ /*分析文件名是否相同*/ if(pDirName->DIR_Name[i]==0x20)continue; /*為20不分析*/ if(pDirName->DIR_Name[i]!=*pBuf)break; else pBuf++; } if(i!=8){pDirName++;continue;} /*沒有找到匹配的短文件名*/ if(*pBuf=='.')pBuf++; for(;i!=11;i++){ if(pDirName->DIR_Name[i]==0x20)continue; if(pDirName->DIR_Name[i]!=*pBuf)break; else pBuf++; } if(i==11){break;} /*表示找到文件名*/ pDirName++; } if(i==11)break; /*找到*/ if(a==1){k=16;break;} } if(k!=16){ pBuf1=LongFileName; x=0; sum=ChkSum(pDirName); /*計算和*/ pLDirName=FBuf?FILE_DATA_BUF_ADDR:FILE_DATA_BUF_ADDR1; /*長文件名指針指向緩沖區(qū)*/ pLDirName+=k-1; if(k==0){pLDirName=FBuf?FILE_DATA_BUF_ADDR1:FILE_DATA_BUF_ADDR; /*如果短文件名是叢第一組開始的,長文件名就要往起移動*/ pLDirName+=15; k=15; } while(1){ if(pLDirName->LDIR_Attr==0x0f&pLDirName->LDIR_Chksum==sum&pLDirName->LDIR_Ord!=0xe5){ for(j=0;j!=5;j++){ *pBuf1=pLDirName->LDIR_Name1[j]; pBuf1++; } for(;j!=11;j++){ *pBuf1=pLDirName->LDIR_Name2[j-5]; pBuf1++; } for(;j!=13;j++){ *pBuf1=pLDirName->LDIR_Name3[j-11]; pBuf1++; } /*這里將長文件名復制出去,最大16*13個長文件名*/ x++; } else break; /*沒有長文件名則條出*/ if(x==15)break; /*最大限制長文件名為16*13字節(jié)*/ if(k==0){ /*首先移動文件指針*/ pLDirName=FBuf?FILE_DATA_BUF_ADDR1:FILE_DATA_BUF_ADDR; pLDirName+=15; } else {pLDirName-=1; k-=1;} } } } *pBuf1=0; pBuf1++; i=CH375FileClose( ); return 0; XFF: return i; }

其中if(pDirName->DIR_Name[i]==0){k=15;a=1;continue;} /*第一個字節(jié)為0,表示以后沒有有效的目錄項了*/ 這句還有后面幾句中的i是在哪賦的值?我總覺得是不是應(yīng)該是0呢

貼上去的程序竟然和原程序有區(qū)別。。。汗 那我還是直接寫幾句好了,就是程序第29,30兩行: if(pDirName->DIR_Name[i]==0){k=15;a=1;continue;} /*第一個字節(jié)為0,表示以后沒有有效的目錄項了*/ if(pDirName->DIR_Name[i]==0xe5){pDirName++;continue;} /*第一個字節(jié)為0XE5表示此項被刪除*/


暈 到底怎么回事啊, if(pDirName->DIR_Name[ i ]==0){k=15;a=1;continue;} /*第一個字節(jié)為0,表示以后沒有有效的目錄項了*/ if(pDirName->DIR_Name[ i ]==0xe5){pDirName++;continue;} /*第一個字節(jié)為0XE5表示此項被刪除*/


暈 空了2格才能顯示。。。


還有,我用了例子中的FILELONG.H定義長文件名: typedef struct _LONG_NAME{ UINT8 LDIR_Ord /*長文件名的組號,如果為0X40則表示最后一個組*/ UINT16 LDIR_Name1[5]; /*長文件名的前5個字節(jié)*/ UINT8 LDIR_Attr; /*屬性必須為ATTR_LONG_NAME*/ UINT8 LDIR_Type; /* 為0表示長文件名的子項*/ UINT8 LDIR_Chksum; /*短文件名的校驗和*/ UINT16 LDIR_Name2[6]; /*長文件名的6-11個字符*/ UINT8 LDIR_FstClusLO[2]; /*為0*/ UINT16 LDIR_Name3[2]; /*長文件名的12-13各自。字符*/

} F_LONG_NAME; /*定義長文件名*/ 可是編譯時這個類型的結(jié)構(gòu)體分配的內(nèi)存竟然是34字節(jié),結(jié)果就是不能正確的指向某短文件名對應(yīng)的長文件名首地址,這是什么造成的呢?和大小端格式有關(guān)系嗎?


可能編譯器有關(guān),用的是什么單片機和編譯器?我們的程序是沒有什么問題的


用的lpc2214,ads1.2.我把長文件名的結(jié)構(gòu)體都改成8位的了,結(jié)果倒是對了。不過麻煩了好多。。。 呵呵,謝謝WanJ { M }的回答。另外,希望你們多一些arm的例程啊。總是51的用著好麻煩。


只有登錄才能回復,可以選擇微信賬號登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频