📄 ch374hft.c
字号:
}
else
{
for( i=0; i!=MAX_PATH_LEN; i++ )// 还原文件路径
mCmdParam.Open.mPathName[i] = BackPathBuf[i];
i = CH374FileCreate( ); // 进行空间扩展
if( i != ERR_SUCCESS )
return i;
CH374FileErase( );
goto P_RETRY; // 重新打开上级目录
}
}
if( BackFdtSector == mCmdParam.Locate.mSectorOffset )
{
mCmdParam.ReadX.mSectorCount = 1; // 读一个扇区到磁盘缓冲区
mCmdParam.ReadX.mDataBuffer = &DISK_BASE_BUF[0];
i = CH374FileReadX( );
CH374DirtyBuffer( ); // 清除磁盘缓冲区
if( i!= ERR_SUCCESS )
return i;
i = ( CH374vSectorSize - 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 = CH374WriteBlock();
if( i!= ERR_SUCCESS )
return i;
if( Mult==0 )
{ // 还原文件路径
for( i=0; i!=MAX_PATH_LEN; i++ )
mCmdParam.Open.mPathName[i] = BackPathBuf[i];
i = CH374FileCreate( );
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 = CH374FileOpen();
if ( i == ERR_OPEN_DIR )
goto P_NEXT0;
}
else
{
i = CH374FileOpen();
if ( i == ERR_OPEN_DIR )
{
while( 1 )
{
P_NEXT0:
mCmdParam.Locate.mSectorOffset = index;
i = CH374FileLocate( );
if( i == ERR_SUCCESS )
{
if( *NowSector == mCmdParam.Locate.mSectorOffset )
{
if( index==0 ) // 处于根目录扇区的开始
return ERR_NO_NAME;
mCmdParam.Locate.mSectorOffset = --index;
i = CH374FileLocate( ); // 读上一个扇区的数据
if( i == ERR_SUCCESS )
{ // 以下保存当前所在扇区数
*NowSector = mCmdParam.Locate.mSectorOffset;
mCmdParam.ReadX.mSectorCount = 1; // 读一个扇区到磁盘缓冲区
mCmdParam.ReadX.mDataBuffer = &DISK_BASE_BUF[0];
i = CH374FileReadX( );
CH374DirtyBuffer( ); // 清除磁盘缓冲区
return i;
}
else
return i;
}
}
else
return i;
index++;
}
}
}
return i;
}
/*==============================================================================
函数名: CH374GetLongName
函数作用: 由完整短文件名路径(可以是文件或文件夹)得到相应的长文件名
==============================================================================*/
UINT8 CH374GetLongName( 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 = CH374FileOpen( );
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[CH374vFdtOffset] );
index = 0;
FirstBit = FALSE;
Backoffset = CH374vFdtOffset;
BackFdtSector = CH374vFdtLba;
if( CH374vFdtOffset == 0 )
{
// 先判断是否处于一个扇区开始 是否处于根目录开始 ,否则向后偏移
if( FirstBit == FALSE )
FirstBit = TRUE;
i = GetUpSectorData( &BackFdtSector );
if( i == ERR_SUCCESS )
{
CH374vFdtOffset = CH374vSectorSize;
goto P_NEXT1;
}
}
else
{
// 读取偏移后的数据,直到结束。如果不够则向后偏移
P_NEXT1:
offset = CH374vFdtOffset;
while( 1 )
{
if( offset != 0 )
{
offset = offset - 32;
if( ( DISK_BASE_BUF[offset + 11] == ATTR_LONG_NAME )
&& ( DISK_BASE_BUF[offset + 13] == sum ) )
{
if( (index + 26) > LONG_NAME_BUF_LEN )
return ERR_BUF_OVER;
for( i=0; i!=5; i++) // 长文件名的1-5个字符
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -