📄 fatfunction.c
字号:
// 调试语句
#ifdef DEBUG_CREAT
printf( " 记录找到的起始簇的簇号:%d \n" , Cluster ) ;
#endif
TotalSectors = FAT.SecPerClus ;
while ( 1 )
{
//计算该簇号对应的FAT表偏移
//读取FAT表,查询要写的簇
FAT.FirstSectofClu = ( ( Cluster - 2 ) * FAT.SecPerClus ) + FAT.FirstDataSector ;
NextCluster = x16List( Cluster , 0, ModeZ2 ) ;
ProcessSector = FAT.FirstSectofClu ;
TransNum = 0 ;
//调试语句
#ifdef DEBUF_CREAT
printf( " 本文件/目录下一个簇号:NextCluster = %d\n ", NextCluster ) ;
#endif
while( TotalSectors )
{
//更新读取扇区参数
ProcessSector += TransNum ;
TransNum = TotalSectors >= DiskNums ? DiskNums : TotalSectors ;
//读取根目录N个扇区( N <= SecNum_of_BUF )到DISK_BUF中
s = mReadSector( ProcessSector ,TransNum ,DISKBUF );
if ( s != USB_INT_SUCCESS )
return( ERR_Check ) ;
//在DISK_BUF中查找文件
TransBytes = TransNum << FAT.shift ;
for ( POINT2 = DISKBUF ; POINT2 < DISKBUF + TransBytes ; POINT2 += 32 )
{
if ( ! ( *POINT2 ) || ( *POINT2 == 0xE5 ) || ( *POINT2 == 0x05 ) ) //若是空文件项,则退出
{
FindFlag = 1 ;
wr -> find.TransNum = TransNum ;
wr -> find.Sector = ProcessSector ;
wr -> find.Offset = POINT2 ;
//调试语句
#ifdef DEBUG_CREAT
printf( " 找到目录/文件 !\n " ) ;
printf( " 文件地址信息记录:\n " ) ;
printf( " 本次传输的扇区数:%d\n ", ( UINT16 )wr -> find.TransNum ) ;
printf( " 本次传输的起始扇区号:%ld\n ", wr -> find.Sector ) ;
printf( " 本次传输的扇区内偏移:%p \n ", wr -> find.Offset ) ;
#endif
break ;
}
}
if ( FindFlag )
break ;
TotalSectors -= TransNum ;
}
if ( FindFlag || NextCluster == 0xFFFF )
break ;
Cluster = NextCluster ;
}
if ( ! FindFlag && NextCluster == 0xFFFF )
{
NextCluster = x16CheckClus( ) ;
if ( NextCluster == 0x00 )
return( ERR_FullDisk ) ;
else if ( NextCluster == ERR_CheckClus )
return( ERR_CheckClus ) ;
wr -> find.TransNum = 1 ;
wr -> find.Sector = ( ( NextCluster - 2 ) * FAT.SecPerClus ) + FAT.FirstDataSector ; ;
wr -> find.Offset = DISKBUF ;
//更新根目录中起始簇信息
//调试语句
#ifdef DEBUG_CREAT
printf( " 更新根目录中簇信息: " ) ;
#endif
s = x16List( Cluster, NextCluster, ModeZ1 ) ;
if( s != ListSuccess )
return( s ) ;
s = x16List( NextCluster, 0xFFFF, ModeZ1 ) ;
if( s != ListSuccess )
return( s ) ;
}
//读取目录可写域信息
ProcessSector = wr -> find.Sector ;
POINT0 = wr -> find.Offset ;
TransNum = wr -> find.TransNum ;
s = mReadSector( ProcessSector, TransNum, DISKBUF );
if ( s != USB_INT_SUCCESS )
return( ERR_Read ) ;
s = xProcessDirectory( wr, Attribute ) ;
if ( s != DirectorySuccess )
return( s ) ;
return( CreatSuccess ) ;
}
/*********************************************************************************************************
** 函数名称: CheckFile
** 功能描述: 在一定范围内查找文件/目录
**
** 输 入: wr : 指向文件信息结构FILE的指针
** TotalSectors: 为该范围总扇区数
** ProcessSector: 为该范围首地址
** 输 出: 在该范围内查找文件,返回FindFlag标识,以便外部程序调用
** 找到的文件/目录在簇内的地址信息记录在FIND结构中
** A.返回ERR_Check报告异常传输错误
** B.返回FindFlag为0x00表示未找到文件
** C.返回FindFlag为0x01表示找到文件
**
** 全局变量: wr -> find.Offset, wr -> find.TransNum, wr -> find.Sector, DiskNums
** 调用模块: mReadSector
** 调试码: DEBUG_CF
**
**
** 作 者: 徐亦朱
** 日 期: 2007年9月21日
**-------------------------------------------------------------------------------------------------------
** 修改人: 徐亦朱
** 日 期: 2007.9.27
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
UINT8 CheckFile( FILE * wr, UINT16 TotalSectors, UINT32 ProcessSector )
{
UINT8 i ;
UINT8 s ;
UINT8 *POINT1 ;
UINT8 *POINT2 ;
UINT8 FindFlag ;
UINT8 TransNum ;
UINT16 TransBytes ;
//初始化变量
FindFlag = 0 ;
TransNum = 0 ;
//在范围内( 1簇或根目录内 )查找文件
while ( TotalSectors )
{
//更新读取扇区参数
ProcessSector += TransNum ;
TransNum = TotalSectors >= DiskNums ? DiskNums : TotalSectors ;
//读取根目录N个扇区( N <= DiskNums )到DISK_BUF中
s = mReadSector( ProcessSector ,TransNum ,DISKBUF );
if ( s != USB_INT_SUCCESS )
return( ERR_Check ) ;
//在DISK_BUF中查找文件
TransBytes = TransNum << FAT.shift ;
for ( POINT1 = DISKBUF ; POINT1 < DISKBUF + TransBytes ; POINT1 += 32 )
{
if ( ! ( *POINT1 ) ) //若是空文件项,则退出
{
FindFlag = 0 ;
return( FindFlag ) ;
}
else //判断文件名是否相同
{
POINT2 = wr -> Name ;
for ( i = 0; i < 11; i ++ )
{
if ( *( POINT1 + i ) == *( POINT2 + i ) )
{
FindFlag = 1 ;
continue ;
}
FindFlag = 0 ;
break ;
}
if ( FindFlag )
{
wr -> find.TransNum = TransNum ;
wr -> find.Sector = ProcessSector ;
wr -> find.Offset = POINT1 ;
//调试语句
#ifdef DEBUG_CF
printf( " 找到目录/文件 !\n " ) ;
printf( " 文件地址信息记录:\n " ) ;
printf( " 本次传输的扇区数:%d\n ", ( UINT16 )wr -> find.TransNum ) ;
printf( " 本次传输的起始扇区号:%ld\n ", wr -> find.Sector ) ;
printf( " 本次传输的扇区内偏移:%p \n ", wr -> find.Offset ) ;
#endif
return( FindFlag ) ;
}
}
}
TotalSectors -= TransNum ;
}
return( FindFlag ) ;
}
/*********************************************************************************************************
** 函数名称: CheckFirst16
** 功能描述: 在FAT16根目录内查找文件 /目录
**
** 输 入: wr : 指向文件信息结构FILE的指针
** 输 出: 在该范围内查找文件,返回FindFlag标识,以便外部程序调用
** 找到的文件/目录在簇内的地址信息记录在FIND结构中
** A.返回ERR_Check报告异常传输错误
** B.返回FindFlag为0x00表示未找到文件
** C.返回FindFlag为0x01表示找到文件
**
** 全局变量: FAT.RootDirSectors, FAT.FirstRootSector
** 调用模块: CheckFile
** 调试码: 无
**
**
** 作 者: 徐亦朱
** 日 期: 2007年9月21日
**-------------------------------------------------------------------------------------------------------
** 修改人: 徐亦朱
** 日 期: 2007.9.27
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
UINT8 CheckFirst16( FILE * wr )
{
UINT8 s ;
UINT8 FindFlag ;
//初始化标记位
FindFlag = 0 ;
s = CheckFile( wr, FAT.RootDirSectors, FAT.FirstRootSector ) ;
if ( s == ERR_Check )
return( s ) ;
FindFlag = s ? 0x01 : 0x00 ;
return( FindFlag ) ;
}
/*********************************************************************************************************
** 函数名称: x16CheckFile
** 功能描述: 在FAT16目录内查找文件
**
** 输 入: wr : 指向文件信息结构FILE的指针
** 输 出: 在该范围内查找文件,返回FindFlag标识,以便外部程序调用
** 找到的文件/目录在簇内的地址信息记录在FIND结构中
** A.返回ERR_Check报告异常传输错误
** B.返回FindFlag为0x00表示未找到文件
** C.返回FindFlag为0x01表示找到文件
**
** 全局变量: wr -> find.Offset, FAT.SecPerClus, FAT.FirstSectofClu
** 调用模块: x16List, CheckFile
** 调试码: DEBUG_XCF
**
**
** 作 者: 徐亦朱
** 日 期: 2007年9月21日
**-------------------------------------------------------------------------------------------------------
** 修改人: 徐亦朱
** 日 期: 2007.9.27
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
UINT8 x16CheckFile( FILE * wr )
{
UINT8 s ;
UINT8 *POINT0 ;
UINT8 FindFlag ;
UINT16 Cluster ;
UINT16 NextCluster ;
//初始化变量
FindFlag = 0 ;
POINT0 = wr -> find.Offset ;
Cluster = ( UINT16 )( *( POINT0 + 26 ) ) | ( UINT16 )( *( POINT0 + 27 ) ) << 8 ;
//调试语句
#ifdef DEBUG_XCF
printf( " 本文件/目录起始簇号:Cluster = %d\n ", Cluster ) ;
#endif
while ( 1 )
{
//计算FAT表信息
FAT.FirstSectofClu = ( ( Cluster - 2 ) * FAT.SecPerClus ) + FAT.FirstDataSector ;
NextCluster = x16List( Cluster , 0, ModeZ2 ) ;
s = CheckFile( wr, FAT.SecPerClus, FAT.FirstSectofClu ) ;
if ( s == ERR_Check )
return( s ) ;
else if ( s == 0x01 )
{
FindFlag = 0x01 ;
return( FindFlag ) ;
}
if ( NextCluster == 0xFFFF )
return( FindFlag ) ;
Cluster = NextCluster ;
}
}
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -