您好,贵公司提供的读u盘长文件名文件的例子exam11中: /*读取指定短文件名的长文件名,返回长文件名在长文件名空间*/ UINT8 mLookUpLName(){ UINT8 BlockSer1; /*定义两个扇区块内记数*/ unsigned char xdata ParData[MAX_PATH_LEN]; /**/ UINT16 tempSec; /*扇区偏移*/ 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; /*短文件名指针指向缓冲区*/ mCmdParam.ReadX.mSectorCount=1; /*读取一扇区数据*/ mCmdParam.ReadX.mDataBuffer=FBuf?FILE_DATA_BUF_ADDR1:FILE_DATA_BUF_ADDR; /*当前处理的文件缓冲区,这里使用双向缓冲区,去处理文件名*/ FBuf=!FBuf; /*缓冲区标志翻转*/ i=CH375FileReadX( ); if(i!=ERR_SUCCESS)goto XFF; if(mCmdParam.ReadX.mSectorCount==0){k=16;break;} /*表示没有数据读出*/ tempSec+=1; /*扇区记数加一*/ for(k=0;k!=16;k++){ pBuf=&ParData[j+1]; if(pDirName->DIR_Name[i]==0){k=15;a=1;continue;} /*第一个字节为0,表示以后没有有效的目录项了*/ if(pDirName->DIR_Name[i]==0xe5){pDirName++;continue;} /*第一个字节为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; /*长文件名指针指向缓冲区*/ 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字节*/ 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;} /*第一个字节为0,表示以后没有有效的目录项了*/ 这句还有后面几句中的i是在哪赋的值?我总觉得是不是应该是0呢