?? ch375hft.c
字號:
}
i = CH375FileOpen(); // 打開上級目錄
if( i == ERR_OPEN_DIR )
{
while( 1 ) // 循環填寫 直到完成
{
mCmdParam.Locate.mSectorOffset = Secoffset;
i = CH375FileLocate( );
if( i == ERR_SUCCESS )
{
if( Fbit ) // 第二次進入次寫扇區
{
if( mCmdParam.Locate.mSectorOffset != 0x0FFFFFFFF )
{
BackFdtSector = mCmdParam.Locate.mSectorOffset;
Backoffset = 0;
}
else
{
for( i=0; i!=MAX_PATH_LEN; i++ )// 還原文件路徑
mCmdParam.Open.mPathName[i] = BackPathBuf[i];
i = CH375FileCreate( ); // 進行空間擴展
if( i != ERR_SUCCESS )
return i;
CH375FileErase( );
goto P_RETRY; // 重新打開上級目錄
}
}
if( BackFdtSector == mCmdParam.Locate.mSectorOffset )
{
mCmdParam.ReadX.mSectorCount = 1; // 讀一個扇區到磁盤緩沖區
mCmdParam.ReadX.mDataBuffer = &DISK_BASE_BUF[0];
i = CH375FileReadX( );
CH375DirtyBuffer( ); // 清除磁盤緩沖區
if( i!= ERR_SUCCESS )
return i;
i = ( CH375vSectorSize - Backoffset ) / 32;
if( Mult > i )
Mult = Mult - i; // 剩余的倍數
else
{
i = Mult;
Mult = 0;
}
for( len=i; len!=0; len-- )
{
indexBak -= 26;
index = indexBak;
for( i=0; i!=5; i++) // 長文件名的1-5個字符
{ // 在磁盤上UNICODE用小端方式存放
#if UNICODE_ENDIAN == 1
DISK_BASE_BUF[Backoffset + i*2 + 2 ] =
LongNameBuf[index++];
DISK_BASE_BUF[Backoffset + i*2 + 1 ] =
LongNameBuf[index++];
#else
DISK_BASE_BUF[Backoffset + i*2 + 1 ] =
LongNameBuf[index++];
DISK_BASE_BUF[Backoffset + i*2 + 2 ] =
LongNameBuf[index++];
#endif
}
for( i =0; i!=6; i++) // 長文件名的6-11個字符
{
#if UNICODE_ENDIAN == 1
DISK_BASE_BUF[Backoffset + 14 + i*2 + 1 ] =
LongNameBuf[index++];
DISK_BASE_BUF[Backoffset + 14 + i*2 ] =
LongNameBuf[index++];
#else
DISK_BASE_BUF[Backoffset + 14 + i*2 ] =
LongNameBuf[index++];
DISK_BASE_BUF[Backoffset + 14 + i*2 + 1 ] =
LongNameBuf[index++];
#endif
}
for( i=0; i!=2; i++) // 長文件名的12-13個字符
{
#if UNICODE_ENDIAN == 1
DISK_BASE_BUF[Backoffset + 28 + i*2 + 1 ] =
LongNameBuf[index++];
DISK_BASE_BUF[Backoffset + 28 + i*2 ] =
LongNameBuf[index++];
#else
DISK_BASE_BUF[Backoffset + 28 + i*2 ] =
LongNameBuf[index++];
DISK_BASE_BUF[Backoffset + 28 + i*2 + 1 ] =
LongNameBuf[index++];
#endif
}
DISK_BASE_BUF[Backoffset + 0x0b] = 0x0f;
DISK_BASE_BUF[Backoffset + 0x0c] = 0x00;
DISK_BASE_BUF[Backoffset + 0x0d] = sum;
DISK_BASE_BUF[Backoffset + 0x1a] = 0x00;
DISK_BASE_BUF[Backoffset + 0x1b] = 0x00;
DISK_BASE_BUF[Backoffset] = MultBak--;
Backoffset += 32;
}
if( !Fbit )
{
Fbit = TRUE;
DISK_BASE_BUF[ BackoffsetBak ] |= 0x40;
}
mCmdParam.WriteB.mLbaCount = 1;
mCmdParam.WriteB.mLbaStart = BackFdtSector;
mCmdParam.WriteB.mDataBuffer = DISK_BASE_BUF;
i = CH375WriteBlock();
if( i!= ERR_SUCCESS )
return i;
if( Mult==0 )
{ // 還原文件路徑
for( i=0; i!=MAX_PATH_LEN; i++ )
mCmdParam.Open.mPathName[i] = BackPathBuf[i];
i = CH375FileCreate( );
return i;
}
}
}
else
return i;
Secoffset++;
}
}
}
return i;
}
/*==============================================================================
函數名: GetUpSectorData
函數作用: 由當前扇區得到上一個扇區的數據,放在磁盤緩沖區
==============================================================================*/
UINT8 GetUpSectorData( UINT32 *NowSector )
{
UINT8 i;
UINT8 len; // 存放路徑的長度
UINT32 index; // 目錄扇區偏移扇區數
index = 0;
for(len=0; len!=MAX_PATH_LEN; len++)
{
if(mCmdParam.Open.mPathName[len] == 0) // 得到字符串長度
break;
}
for(i=len-1; i!=0xff; i--) // 得到上級目錄位置
{
if((mCmdParam.Open.mPathName[i] == '\\') || (mCmdParam.Open.mPathName[i] == '/'))
break;
}
mCmdParam.Open.mPathName[i] = 0x00;
if( i==0 ) // 打開一級目錄注意:處在根目錄開始的特殊情況
{
mCmdParam.Open.mPathName[0] = '/';
mCmdParam.Open.mPathName[1] = 0;
i = CH375FileOpen();
if ( i == ERR_OPEN_DIR )
goto P_NEXT0;
}
else
{
i = CH375FileOpen();
if ( i == ERR_OPEN_DIR )
{
while( 1 )
{
P_NEXT0:
mCmdParam.Locate.mSectorOffset = index;
i = CH375FileLocate( );
if( i == ERR_SUCCESS )
{
if( *NowSector == mCmdParam.Locate.mSectorOffset )
{
if( index==0 ) // 處于根目錄扇區的開始
return ERR_NO_NAME;
mCmdParam.Locate.mSectorOffset = --index;
i = CH375FileLocate( ); // 讀上一個扇區的數據
if( i == ERR_SUCCESS )
{ // 以下保存當前所在扇區數
*NowSector = mCmdParam.Locate.mSectorOffset;
mCmdParam.ReadX.mSectorCount = 1; // 讀一個扇區到磁盤緩沖區
mCmdParam.ReadX.mDataBuffer = &DISK_BASE_BUF[0];
i = CH375FileReadX( );
CH375DirtyBuffer( ); // 清除磁盤緩沖區
return i;
}
else
return i;
}
}
else
return i;
index++;
}
}
}
return i;
}
/*==============================================================================
函數名: CH375GetLongName
函數作用: 由完整短文件名路徑(可以是文件或文件夾)得到相應的長文件名
==============================================================================*/
UINT8 CH375GetLongName( void )
{
// 需要變量扇區大小
// 第一步:打開文件是否找到文件,分析文件是否存在,并得到FDT在此扇區的偏移和所在扇區
// 第二步:分析上面的信息看是否有長文件名存在,是否處于目錄的第一個扇區的開始
// 第三步:實現向后偏移一個扇區?讀取長文件名(扇區512字節的U盤)
UINT8 i;
UINT16 index; // 在長文件名緩沖區內的索引
UINT32 BackFdtSector; // 保寸偏移上一個扇區
UINT8 sum; // 保存長文件名的校驗和
UINT16 Backoffset; // 保存文件偏移備份
UINT16 offset; // 扇區內文件偏移32倍數
UINT8 FirstBit; // 長文件名跨越兩個扇區標志位
UINT8 xdata BackPathBuf[MAX_PATH_LEN]; // 保存文件路徑
i = CH375FileOpen( );
if( ( i == ERR_SUCCESS ) || ( i == ERR_OPEN_DIR ) )
{
for( i=0; i!=MAX_PATH_LEN; i++ )
BackPathBuf[i] = mCmdParam.Open.mPathName[i];
// 以上完成對路徑的備份
sum = CheckNameSum( &DISK_BASE_BUF[CH375vFdtOffset] );
index = 0;
FirstBit = FALSE;
Backoffset = CH375vFdtOffset;
BackFdtSector = CH375vFdtLba;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -