CH375读长文件名文件问题

您好,贵公司提供的读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呢

贴上去的程序竟然和原程序有区别。。。汗 那我还是直接写几句好了,就是程序第29,30两行: if(pDirName->DIR_Name[i]==0){k=15;a=1;continue;} /*第一个字节为0,表示以后没有有效的目录项了*/ if(pDirName->DIR_Name[i]==0xe5){pDirName++;continue;} /*第一个字节为0XE5表示此项被删除*/


晕 到底怎么回事啊, if(pDirName->DIR_Name[ i ]==0){k=15;a=1;continue;} /*第一个字节为0,表示以后没有有效的目录项了*/ if(pDirName->DIR_Name[ i ]==0xe5){pDirName++;continue;} /*第一个字节为0XE5表示此项被删除*/


晕 空了2格才能显示。。。


还有,我用了例子中的FILELONG.H定义长文件名: typedef struct _LONG_NAME{ UINT8 LDIR_Ord /*长文件名的组号,如果为0X40则表示最后一个组*/ UINT16 LDIR_Name1[5]; /*长文件名的前5个字节*/ 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; /*定义长文件名*/ 可是编译时这个类型的结构体分配的内存竟然是34字节,结果就是不能正确的指向某短文件名对应的长文件名首地址,这是什么造成的呢?和大小端格式有关系吗?


可能编译器有关,用的是什么单片机和编译器?我们的程序是没有什么问题的


用的lpc2214,ads1.2.我把长文件名的结构体都改成8位的了,结果倒是对了。不过麻烦了好多。。。 呵呵,谢谢WanJ { M }的回答。另外,希望你们多一些arm的例程啊。总是51的用着好麻烦。


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