?? 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 + -