📄 exam11.c
字号:
FileDataBuf1[0]=0xe5; /*无效上次缓冲区*/
k=0xff;
while(1){ /*下面是读取并分析目录项*/
pDirName=FBuf?FILE_DATA_BUF_ADDR1:FILE_DATA_BUF_ADDR; /*短文件名指针指向缓冲区*/
pLDirName=FBuf?FILE_DATA_BUF_ADDR:FILE_DATA_BUF_ADDR1;
mCmdParam.ReadX.mSectorCount=1; /*读取一扇区数据*/
mCmdParam.ReadX.mDataBuffer=FBuf?FILE_DATA_BUF_ADDR1:FILE_DATA_BUF_ADDR; /*当前处理的文件缓冲区,这里使用双向缓冲区,去处理文件名*/
FBuf=!FBuf; /*缓冲区标志翻转*/
i=CH375FileReadX( );
if(mCmdParam.ReadX.mSectorCount==0){k=0xff;break;}
tempSec+=1;
k=mLDirCheck(pDirName,pLDirName);
z=k;
z&=0x0f;
if(k!=0x0ff){break;} /*找到文件或者找到文件结尾退出*/
}
if(k<16){
pDirName+=k; /*所找的文件短文件名在此目录项*/
if(j!=0xff){
for(k=0;k!=j+1;k++)mCmdParam.Other.mBuffer[k]=ParData[k];
}
pBuf1=&mCmdParam.Other.mBuffer[j+1]; /*取文件名的地址*/
//else pBuf1=&mCmdParam.Other.mBuffer;
for(i=0;i!=8;i++){
if(pDirName->DIR_Name[i]==0x20)continue;
else {
*pBuf1=pDirName->DIR_Name[i];
pBuf1++;
}
}
if(pDirName->DIR_Name[i]!=0x20){
*pBuf1='.';
pBuf1++;
}
for(;i!=11;i++){
if(pDirName->DIR_Name[i]==0x20)continue;
else {
*pBuf1=pDirName->DIR_Name[i];
pBuf1++;
}
} /*复制短文件名*/
i=CH375FileClose();
i=CH375FileCreate(); /*疑惑这里要不要恢复到刚进入此函数时的簇号*/
return i; /*创建文件,返回状态*/
}
else { /*表示目录项枚举到结束位置,要创建文件*/
if(k==0xff){z=00;tempSec+=1;}
i=CH375FileClose();
for(k=0;k!=MAX_PATH_LEN;k++)mCmdParam.Other.mBuffer[k]=ParData[k]; /*试创建文件短文件名*/
for(x=0x31;x!=0x3a;x++){ /*生成短文件名*/
for(y=0x31;y!=0x3a;y++){
for(i=0x31;i!=0x3a;i++){
mCmdParam.Other.mBuffer[j+7]=i;
mCmdParam.Other.mBuffer[j+6]='~';
mCmdParam.Other.mBuffer[j+5]=y;
mCmdParam.Other.mBuffer[j+4]=x;
if(CH375FileOpen()!=ERR_SUCCESS)goto XAA1; /**/
}
}
}
i=0xff;
goto XBB; /*命名无法正确进行*/
XAA1:
i=CH375FileCreate();
if(i!=ERR_SUCCESS);//{goto XCC;} /*出错则不能继续进行*/
for(k=0;k!=MAX_PATH_LEN;k++)ParData[k]=mCmdParam.Other.mBuffer[k]; /*试创建文件短文件名*/
i=mChkName(&j);
mCmdParam.Locate.mSectorOffset=tempSec-1;
i=CH375FileLocate();
if(i!=ERR_SUCCESS);//{goto XCC;} /*出错则不能继续进行*/
mCmdParam.ReadX.mSectorCount=1;
mCmdParam.ReadX.mDataBuffer=FILE_DATA_BUF_ADDR;
pDirName=FILE_DATA_BUF_ADDR;
pDirName+=z; /*指向创建文件名的偏移*/
i=CH375FileReadX(); /*读取下一个扇区的数据,取第一个目录项就是刚才创建的短文件名*/
if(i!=ERR_SUCCESS);//{goto XCC;} /*这里要做出错误处理*/
for(i=0;i!=CH375_FILE_LONG_NAME;i++){
if(LongFileName[i]==00)break; /*计算长文件名的长度*/
}
for(k=i+1;k!=CH375_FILE_LONG_NAME;k++){ /*将无效长目录处填充*/
LongFileName[k]=0xffff;
}
pBuf=FILE_DATA_BUF_ADDR1; /**/
*pBuf=0; /*清缓冲区一个字节*/
*pBuf=0; /*清缓冲区一个字节*/
k=i/13; /*取长文件名组数*/
i=i%13;
if(i!=0)k=k+1; /*有余数则算一组*/
i=k;
//pLDirName=(F_LONG_NAME xdata *)pDirName;
k=i+z; /*z为短文件偏移,z-1为长文件偏移*/
if(k<16){
pDirName1=FILE_DATA_BUF_ADDR;
pDirName1+=k;
pLDirName=FILE_DATA_BUF_ADDR;
pLDirName+=k-1;
}
else if(k==16){
pDirName1=FILE_DATA_BUF_ADDR1;
pDirName1+=k-16;
pLDirName=FILE_DATA_BUF_ADDR;
pLDirName+=k-1;
}
else if(k>16){
pDirName1=FILE_DATA_BUF_ADDR1;
pDirName1+=k-16;
pLDirName=FILE_DATA_BUF_ADDR1;
pLDirName+=k-1-16;
}
/*复制短文件名,将短文件名复制到指定区域*/
pDirName1->DIR_NTRes=pDirName->DIR_NTRes;
pDirName1->DIR_CrtTimeTenth=pDirName->DIR_CrtTimeTenth;
pDirName1->DIR_CrtTime=pDirName->DIR_CrtTime;
pDirName1->DIR_CrtDate=pDirName->DIR_CrtDate;
pDirName1->DIR_LstAccDate=pDirName->DIR_LstAccDate;
pDirName1->DIR_FstClusHI=pDirName->DIR_FstClusHI;
pDirName1->DIR_WrtTime=pDirName->DIR_WrtTime;
pDirName1->DIR_WrtDate=pDirName->DIR_WrtDate;
pDirName1->DIR_FstClusLO=pDirName->DIR_FstClusLO;
pDirName1->DIR_FileSize=pDirName->DIR_FileSize;
pDirName1->DIR_Attr=pDirName->DIR_Attr;
pDirName1->DIR_Name[0]=pDirName->DIR_Name[0];
pDirName1->DIR_Name[1]=pDirName->DIR_Name[1];
pDirName1->DIR_Name[2]=pDirName->DIR_Name[2];
pDirName1->DIR_Name[3]=pDirName->DIR_Name[3];
pDirName1->DIR_Name[4]=pDirName->DIR_Name[4];
pDirName1->DIR_Name[5]=pDirName->DIR_Name[5];
pDirName1->DIR_Name[6]=pDirName->DIR_Name[6];
pDirName1->DIR_Name[7]=pDirName->DIR_Name[7];
pDirName1->DIR_Name[8]=pDirName->DIR_Name[8];
pDirName1->DIR_Name[9]=pDirName->DIR_Name[9];
pDirName1->DIR_Name[10]=pDirName->DIR_Name[10];
pDirName1->DIR_Name[10]=pDirName->DIR_Name[10];
sum=ChkSum(pDirName1); /*计算累加和*/
pBuf=LongFileName; /*指向长文件名空间*/
y=1;
if(k>16){
for(i=1;i!=k-16+1;i++){ /*>?????*/
pLDirName->LDIR_Ord=y;
pLDirName->LDIR_Name1[0]=*pBuf;
pBuf++;
pLDirName->LDIR_Name1[1]=*pBuf;
pBuf++;
pLDirName->LDIR_Name1[2]=*pBuf;
pBuf++;
pLDirName->LDIR_Name1[3]=*pBuf;
pBuf++;
pLDirName->LDIR_Name1[4]=*pBuf;
pBuf++;
pLDirName->LDIR_Attr=0x0f;
pLDirName->LDIR_Type=0;
pLDirName->LDIR_Chksum=sum;
pLDirName->LDIR_Name2[0]=*pBuf;
pBuf++;
pLDirName->LDIR_Name2[1]=*pBuf;
pBuf++;
pLDirName->LDIR_Name2[2]=*pBuf;
pBuf++;
pLDirName->LDIR_Name2[3]=*pBuf;
pBuf++;
pLDirName->LDIR_Name2[4]=*pBuf;
pBuf++;
pLDirName->LDIR_Name2[5]=*pBuf;
pBuf++;
pLDirName->LDIR_FstClusLO[0]=0;
pLDirName->LDIR_FstClusLO[1]=0;
pLDirName->LDIR_Name3[0]=*pBuf;
pBuf++;
pLDirName->LDIR_Name3[1]=*pBuf;
pBuf++;
pLDirName--;
y+=1;
}
k=16;
k=16;
k=16;
i=0;
pLDirName=FILE_DATA_BUF_ADDR;
pLDirName+=k-1;
}
if(k>16)k=16;
for(i=1;i!=k-z;i++){ /*>?????*/
pLDirName->LDIR_Ord=y;
pLDirName->LDIR_Name1[0]=*pBuf;
pBuf++;
pLDirName->LDIR_Name1[1]=*pBuf;
pBuf++;
pLDirName->LDIR_Name1[2]=*pBuf;
pBuf++;
pLDirName->LDIR_Name1[3]=*pBuf;
pBuf++;
pLDirName->LDIR_Name1[4]=*pBuf;
pBuf++;
pLDirName->LDIR_Attr=0x0f;
pLDirName->LDIR_Type=0;
pLDirName->LDIR_Chksum=sum;
pLDirName->LDIR_Name2[0]=*pBuf;
pBuf++;
pLDirName->LDIR_Name2[1]=*pBuf;
pBuf++;
pLDirName->LDIR_Name2[2]=*pBuf;
pBuf++;
pLDirName->LDIR_Name2[3]=*pBuf;
pBuf++;
pLDirName->LDIR_Name2[4]=*pBuf;
pBuf++;
pLDirName->LDIR_Name2[5]=*pBuf;
pBuf++;
pLDirName->LDIR_FstClusLO[0]=0;
pLDirName->LDIR_FstClusLO[1]=0;
pLDirName->LDIR_Name3[0]=*pBuf;
pBuf++;
pLDirName->LDIR_Name3[1]=*pBuf;
pBuf++;
pLDirName--;
y+=1;
}
pLDirName->LDIR_Ord=y|0x40;
pLDirName->LDIR_Name1[0]=*pBuf;
pBuf++;
pLDirName->LDIR_Name1[1]=*pBuf;
pBuf++;
pLDirName->LDIR_Name1[2]=*pBuf;
pBuf++;
pLDirName->LDIR_Name1[3]=*pBuf;
pBuf++;
pLDirName->LDIR_Name1[4]=*pBuf;
pBuf++;
pLDirName->LDIR_Attr=0x0f;
pLDirName->LDIR_Type=0;
pLDirName->LDIR_Chksum=sum;
pLDirName->LDIR_Name2[0]=*pBuf;
pBuf++;
pLDirName->LDIR_Name2[1]=*pBuf;
pBuf++;
pLDirName->LDIR_Name2[2]=*pBuf;
pBuf++;
pLDirName->LDIR_Name2[3]=*pBuf;
pBuf++;
pLDirName->LDIR_Name2[4]=*pBuf;
pBuf++;
pLDirName->LDIR_Name2[5]=*pBuf;
pBuf++;
pLDirName->LDIR_FstClusLO[0]=0;
pLDirName->LDIR_FstClusLO[1]=0;
pLDirName->LDIR_Name3[0]=*pBuf;
pBuf++;
pLDirName->LDIR_Name3[1]=*pBuf;
pBuf++;
pBuf=(unsigned int xdata *)pDirName1;
pBuf+=16;
if(pBuf<(FILE_DATA_BUF_ADDR+0x200)){
i=2;
while(1){
*pBuf=0;
pBuf++;
if(pBuf==FILE_DATA_BUF_ADDR+0x200)break;
}
i++;
}
else if(pBuf<(FILE_DATA_BUF_ADDR1+0x200)){
i=1;
while(1){
*pBuf=0;
pBuf++;
if(pBuf==(FILE_DATA_BUF_ADDR1+0x200))break;
}
i++;
}
mCmdParam.Locate.mSectorOffset=tempSec-1;
CH375DirtyBuffer();
i=CH375FileLocate();
if(i!=ERR_SUCCESS); /*出错则不能继续进行*/
mCmdParam.ReadX.mSectorCount=1; /*下面重新*/
mCmdParam.ReadX.mDataBuffer=FILE_DATA_BUF_ADDR;
CH375DirtyBuffer();
i=CH375FileWriteX(); /*读取下一个扇区的数据,取第一个目录项就是刚才创建的短文件名*/
CH375DirtyBuffer( );
if(i!=ERR_SUCCESS); /*这里要做出错误处理*/
pBuf=FILE_DATA_BUF_ADDR1; /**/
if(*pBuf!=0){
mCmdParam.ReadX.mSectorCount=1;
mCmdParam.ReadX.mDataBuffer=FILE_DATA_BUF_ADDR1;
i=CH375FileWriteX();
CH375DirtyBuffer( );
}
/*如果是在根目录下操作应关闭根目录*/
/*下面还要打开文件*/
i=CH375FileClose();
for(k=0;k!=MAX_PATH_LEN;k++)mCmdParam.Other.mBuffer[k]=ParData[k]; /*试创建文件短文件名*/
i=CH375FileOpen(); /*打开创建的文件*/
return i;
}
}
XBB: {
return i=0xfe;
}
}
/*删除指定短文件名的文件,同时删除对应的长文件名,返回状态和非长文件操作相同*/
UINT8 mdeleteFile(){
UINT8 BlockSer1; /*定义两个扇区块内记数*/
unsigned char xdata ParData[MAX_PATH_LEN]; /*定义一个存放文件名的缓冲区*/
UINT16 tempSec; /*扇区偏移*/
UINT8 a,i,j,k,x,sum;
F_LONG_NAME xdata *pLDirName; /*长文件名指针*/
P_FAT_DIR_INFO pDirName; /*短文件名指针*/
bit FBuf; /*定义一个文件缓冲区的翻转位*/
unsigned char xdata *pBuf; /*指向缓冲区的指针*/
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 XLL;
if(mCmdParam.ReadX.mSectorCount==0){k=16;break;} /*表示没有数据读出*/
tempSec+=1; /*扇区记数加一*/
for(k=0;k!=16;k++){
pBuf=&ParData[j+1];
if(pDirName->DIR_Name[0]==0){k=15;a=1;continue;} /*第一个字节为0,表示以后没有有效的目录项了*/
if(pDirName->DIR_Name[0]==0xe5){pDirName++;continue;} /*第一个字节为0XE5表示此项被删除*/
if(pDirName->DIR_Attr==ATTR_VOLUME_ID){pDirName++;continue;} /*为卷标,不分析*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -