📄 exam11.c
字号:
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){
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)){
pLDirName->LDIR_Ord=0xe5; /*删除长文件名*/
x++;
k=k-1;
}
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;}
}
if(tempSec!=0){
tempSec-=1;
mCmdParam.Locate.mSectorOffset=(unsigned long)tempSec; /*将分析过的目录项重新写入*/
i=CH375FileLocate();
if(i!=ERR_SUCCESS)goto XLL;
mCmdParam.ReadX.mSectorCount=1;
mCmdParam.ReadX.mDataBuffer=FBuf?FILE_DATA_BUF_ADDR:FILE_DATA_BUF_ADDR1;
i=CH375FileWriteX( );
if(i!=ERR_SUCCESS)goto XLL;
}
if(tempSec!=0){
tempSec-=1;
mCmdParam.Locate.mSectorOffset=(unsigned long)tempSec; /*将分析过的目录项重新写入*/
i=CH375FileLocate();
if(i!=ERR_SUCCESS)goto XLL;
mCmdParam.ReadX.mSectorCount=1;
mCmdParam.ReadX.mDataBuffer=FBuf?FILE_DATA_BUF_ADDR1:FILE_DATA_BUF_ADDR;
i=CH375FileWriteX( );
if(i!=ERR_SUCCESS)goto XLL;
}
}
}
CH375DirtyBuffer( );
i=CH375FileClose( );
CH375DirtyBuffer( ); /*清磁盘缓冲区*/
for(k=0;k!=MAX_PATH_LEN;k++)mCmdParam.Other.mBuffer[k]=ParData[k]; /**/
i=CH375FileErase( );
return i;
XLL: return i; /*出错时,返回错误信息*/
}
/*读取指定短文件名的长文件名,返回长文件名在长文件名空间*/
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;
}
main( ) {
UINT8 i,k;
UINT16 X;
LED_OUT_INIT( );
LED_OUT_ACT( ); /* 开机后LED亮一下以示工作 */
mDelaymS( 100 ); /* 延时100毫秒 */
LED_OUT_INACT( );
mInitSTDIO( ); /* 为了让计算机通过串口监控演示过程 */
printf( "Start\n" );
i = CH375LibInit( ); /* 初始化CH375程序库和CH375芯片,操作成功返回0 */
mStopIfError( i );
/* 其它电路初始化 */
while ( 1 ) {
// printf( "Wait Udisk\n" );
while ( CH375DiskStatus != DISK_CONNECT ) xQueryInterrupt( ); /* 查询CH375中断并更新中断状态,等待U盘插入 */
LED_OUT_ACT( ); /* LED亮 */
mDelaymS( 200 ); /* 延时,可选操作,有的USB存储器需要几十毫秒的延时 */
/* 检查U盘是否准备好,有些U盘不需要这一步,但是某些U盘必须要执行这一步才能工作 */
for ( i = 0; i < 5; i ++ ) { /* 有的U盘总是返回未准备好,不过可以被忽略 */
mDelaymS( 100 );
// printf( "Ready ?\n" );
if ( CH375DiskReady( ) == ERR_SUCCESS ) break; /* 查询磁盘是否准备好 */
}
/* 查询磁盘物理容量 */
// printf( "DiskSize\n" );
// i = CH375DiskSize( );
// mStopIfError( i );
// printf( "TotalSize = %u MB \n", (unsigned int)( mCmdParam.DiskSize.mDiskSizeSec >> 11 ) ); /* 显示为以MB为单位的容量 */
LED_RUN_ACT( ); /* 开始操作U盘 */
X=0X4100;
for(k=0;k!=0x0F;k++){ /*演示创建长文件名*/
mCmdParam.Erase.mPathName[0]='/'; /*给出参考短文件名*/
mCmdParam.Erase.mPathName[1]='C';
mCmdParam.Erase.mPathName[2]='/';
mCmdParam.Erase.mPathName[3]='A';
mCmdParam.Erase.mPathName[4]='B';
mCmdParam.Erase.mPathName[5]='C';
mCmdParam.Erase.mPathName[6]='D';
mCmdParam.Erase.mPathName[7]='A';
mCmdParam.Erase.mPathName[8]='~';
mCmdParam.Erase.mPathName[9]='1';
mCmdParam.Erase.mPathName[10]='2';
mCmdParam.Erase.mPathName[11]='.';
mCmdParam.Erase.mPathName[12]='C';
mCmdParam.Erase.mPathName[13]=00;
LongFileName[0]=0X4100; /*给出UNICODE的长文件名*/
LongFileName[1]=0X4200; /* 对于小端数据格式的单片机,例如AVR/MSP430/ARM等是0x0042,下同 */
LongFileName[2]=0X4300;
LongFileName[3]=0X4400;
LongFileName[4]=0X4500;
LongFileName[5]=0X4600;
LongFileName[6]=0X4700;
LongFileName[7]=0X4800;
LongFileName[8]=0X4100;
LongFileName[9]=0X6300;
LongFileName[10]=0X6200;
LongFileName[11]=0X6100;
LongFileName[12]=X;
LongFileName[13]=X;
LongFileName[14]=0X2e00;
LongFileName[15]=0X4300;
LongFileName[16]=0X0000;
i=mCreatLName(); /*创建长文件名*/
X+=0X100;
}
X=0X4100;
for(k=0;k!=0x0F;k++){ /*演示创建长文件名*/
mCmdParam.Erase.mPathName[0]='/'; /*给出参考短文件名*/
mCmdParam.Erase.mPathName[1]='A';
mCmdParam.Erase.mPathName[2]='B';
mCmdParam.Erase.mPathName[3]='C';
mCmdParam.Erase.mPathName[4]='D';
mCmdParam.Erase.mPathName[5]='A';
mCmdParam.Erase.mPathName[6]='~';
mCmdParam.Erase.mPathName[7]='1';
mCmdParam.Erase.mPathName[8]='1';
mCmdParam.Erase.mPathName[9]='.';
mCmdParam.Erase.mPathName[10]='C';
mCmdParam.Erase.mPathName[11]=00;
LongFileName[0]=0X6100; /*给出UNICODE的长文件名*/
LongFileName[1]=0X4200;
LongFileName[2]=0X6300;
LongFileName[3]=0X4400;
LongFileName[4]=0X4500;
LongFileName[5]=0X6500;
LongFileName[6]=0X4700;
LongFileName[7]=0X4800;
LongFileName[8]=0X4100;
LongFileName[9]=0X6300;
LongFileName[10]=0X6200;
LongFileName[11]=0X6100;
LongFileName[12]=X;
LongFileName[13]=X;
LongFileName[14]=0X2e00;
LongFileName[15]=0X4300;
LongFileName[16]=0X0000;
i=mCreatLName(); /*创建长文件名*/
X+=0X100;
}
X=0X4100;
for(k=0;k!=0x4;k++){ /*查找并删除*/
mCmdParam.Erase.mPathName[0]='/'; /*给出路径*/
mCmdParam.Erase.mPathName[1]='C';
mCmdParam.Erase.mPathName[2]='/';
mCmdParam.Erase.mPathName[3]=00;
LongFileName[0]=0X4100; /*给出长文件名*/
LongFileName[1]=0X4200;
LongFileName[2]=0X4300;
LongFileName[3]=0X4400;
LongFileName[4]=0X4500;
LongFileName[5]=0X4600;
LongFileName[6]=0X4700;
LongFileName[7]=0X4800;
LongFileName[8]=0X4100;
LongFileName[9]=0X6300;
LongFileName[10]=0X6200;
LongFileName[11]=0X6100;
LongFileName[12]=X;
LongFileName[13]=X;
LongFileName[14]=0X2e00;
LongFileName[15]=0X4300;
LongFileName[16]=0X0000;
i=mLoopkUpSName(); /*查找短文件名*/
i=mdeleteFile(); /*删除文件*/
X+=0X100;
}
X=0;
while(1)
{
mCmdParam.Erase.mPathName[0]='/'; /*给出路径*/
mCmdParam.Erase.mPathName[1]='C';
mCmdParam.Erase.mPathName[2]='/';
mCmdParam.Erase.mPathName[3]='*';
mCmdParam.Erase.mPathName[4]=X;
mCmdParam.Erase.mPathName[5]=00;
mCmdParam.Erase.mPathName[6]=00;
i=CH375FileOpen();
if ( i == ERR_MISS_FILE ) break; /* 再也搜索不到匹配的文件,已经没有匹配的文件名 */
if ( i == ERR_FOUND_NAME ) { /* 搜索到与通配符相匹配的文件名,文件名及其完整路径在命令缓冲区中 */
i=mLookUpLName(); /*搜索对应的长文件名*/
}
X++;
if(X==0xfE)break;
}
LED_WR_INACT( );
LED_RUN_INACT( );
printf( "Take out\n" );
while ( CH375DiskStatus != DISK_DISCONNECT ) xQueryInterrupt( ); /* 查询CH375中断并更新中断状态,等待U盘拔出 */
LED_OUT_INACT( ); /* LED灭 */
mDelaymS( 200 );
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -