⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 exam11.c

📁 使用CH375USB接口芯片创建长文件名
💻 C
📖 第 1 页 / 共 3 页
字号:
		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 + -