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