📄 fatprocess.c
字号:
bytes += files[ i ].wr.write.extra ;
files[ i ].wr.write.extra = bytes - ( bytes >> FAT.shift << FAT.shift ) ;
}
}
else
writesectors = WriteNums >> FAT.shift ;
//初始化写入起始扇区数
ProcessSector = files[ i ].EndSector ;
#ifdef DEBUG_WRITE
printf( "FILEBUF中这次读取的零头数据为 : %d\n", bytes ) ;
printf( "现在FILEBUF中的零头数据为: %d\n", files[ i ].wr.write.extra ) ;
printf( "本次要写入的扇区数: %d\n", ( UINT16 )writesectors ) ;
printf( "本次要写入的起始扇区号: %ld\n", ProcessSector ) ;
#endif
//判断越界
if ( files[ i ].wr.write.WritedSectors + writesectors > FAT.SecPerClus )
{
//调试语句
#ifdef DEBUG_WRITE
printf( " 数据越界 ! \n " ) ;
#endif
TransNum = FAT.SecPerClus - files[ i ].wr.write.WritedSectors ;
s = mWriteSector( ProcessSector, TransNum, FILEBUF );
if ( s != USB_INT_SUCCESS )
return( ERR_Write ) ;
TransBytes = TransNum << FAT.shift ;
TransNum = writesectors - TransNum ;
//调试语句
#ifdef DEBUG_WRITE
printf( "越界时第一次传输的字节数 : %d\n ", TransBytes ) ;
#endif
//越界的数据写入另一个空白簇
//注意此时前一数据已写入,但是FAT表未更新
Cluster = x16CheckClus( ) ;
if ( Cluster == 0x00 )
return( ERR_FullDisk ) ;
else if ( Cluster == ERR_CheckClus )
return( ERR_CheckClus ) ;
//调试语句
#ifdef DEBUG_WRITE
printf( " 找到的新的可写簇号为: %d\n " , Cluster ) ;
#endif
//更新FAT表
s = x16List( files[ i ].clus.fat16.EndClus, Cluster, ModeZ1 ) ;
if( s != ListSuccess )
return( s ) ;
files[ i ].clus.fat16.EndClus = Cluster ;
s = x16List( files[ i ].clus.fat16.EndClus, 0xFFFF, ModeZ1 ) ;
if( s != ListSuccess )
return( s ) ;
files[ i ].EndSector = ( ( files[ i ].clus.fat16.EndClus - 2 ) * FAT.SecPerClus ) + FAT.FirstDataSector ;
//写入剩余的数据
s = mWriteSector( files[ i ].EndSector, TransNum, FILEBUF + TransBytes );
if ( s != USB_INT_SUCCESS )
return( ERR_Write ) ;
files[ i ].EndSector += TransNum ;
files[ i ].wr.write.WritedSectors = TransNum ;
}
else
{
//调试语句
#ifdef DEBUG_WRITE
printf( " 本次数据传输不越界 ! \n " ) ;
#endif
TransNum = writesectors ;
s = mWriteSector( ProcessSector, TransNum, FILEBUF );
if ( s != USB_INT_SUCCESS )
return( ERR_Write ) ;
//更新FAT表
s = x16List( files[ i ].clus.fat16.EndClus, 0xFFFF, ModeZ1 ) ;
if( s != ListSuccess )
return( s ) ;
files[ i ].EndSector += TransNum ;
files[ i ].wr.write.WritedSectors += TransNum ;
if ( files[ i ].wr.write.WritedSectors >= FAT.SecPerClus )
{
#ifdef DEBUG_WRITE
printf( "正好写满一簇.\n" ) ;
#endif
Cluster = x16CheckClus( ) ;
if ( Cluster == 0x00 )
return( ERR_FullDisk ) ;
else if ( Cluster == ERR_CheckClus )
return( ERR_CheckClus ) ;
s = x16List( files[ i ].clus.fat16.EndClus, Cluster, ModeZ1 ) ;
if( s != ListSuccess )
return( s ) ;
files[ i ].clus.fat16.EndClus = Cluster ;
files[ i ].EndSector = ( ( files[ i ].clus.fat16.EndClus - 2 ) * FAT.SecPerClus ) + FAT.FirstDataSector ;
files[ i ].wr.write.WritedSectors = 0 ;
}
}
//数据写完后重新组织FILEBUF
memcpy( FILEBUF, FILEBUF + ( writesectors << FAT.shift ), files[ i ].wr.write.extra ) ;
//调试语句
#ifdef DEBUG_WRITE
printf( " 写入成功 ! \n " ) ;
#endif
return( WriteSuccess ) ;
}
/*********************************************************************************************************
** 函数名称: FATClose
** 功能描述: 关闭文件
**
** 输 入: FileNum: 要关闭的文件编号
** 输 出: 文件缓冲区FILE_BUF中不满一个扇区的零碎数据被刷新到文件中
** A.返回ERR_Close报告异常传输错误
** B.返回CloseSuccess则操作成功
**
** 全局变量: files[ i ].wr.write.extra, wr -> find.Offset, wr -> find.TransNum, wr -> find.Sector ,
** FAT.shift, FAT.SecPerClus
** 调用模块: x16List, mReadSector, x16CheckClus, mWriteSector, memcpy
** 调试码: DEBUG_CLOSE
**
**
** 作 者: 徐亦朱
** 日 期: 2007年9月21日
**-------------------------------------------------------------------------------------------------------
** 修改人: 徐亦朱
** 日 期: 2007.9.27
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
UINT8 FATClose( UINT8 FileNum )
{
UINT8 i ;
UINT8 s ;
UINT8 *POINT0 ;
UINT8 TransNum ;
UINT16 time ;
UINT16 date ;
UINT32 ProcessSector ;
//计算系统日期、时间
time = sysclock.time.hour << 11 + sysclock.time.min << 5 + sysclock.time.sec >> 1 ;
date = sysclock.date.year >> 9 + sysclock.date.month << 5 + sysclock.date.day ;
//调试语句
#ifdef DEBUG_CLOSE
printf( "关闭文件 !\n" ) ;
#endif
/*
for ( i = 0; i < 2; i ++ )
printf( "files[ i ].Flags = %d\n", ( UINT16 )files[ i ].Flags ) ;
//确定指定文件是否有效
for ( i = 0; i < 2; i ++ )
if ( ( files[ i ].Flags & 0x07 ) == FileNum )
break ;
if ( ! ( files[ i ].Flags & 0x80 ) || ( ( files[ i ].Flags & 0x07 ) != i ) )
{
printf( " 此时的文件信息:files[ i ].Flags = %d\n ", ( UINT16 )files[ i ].Flags ) ;
printf( " 错误的文件编号: %d\n ", ( UINT16 )i ) ;
return( ERR_Close ) ;
}*/
/* 下面这段实际只是为保险起见,在程序测试无错后可以用下面这句代替 */
i = FileNum ;
//判断文件关闭前是写入的还是读取的
if ( files[ i ].Flags & 0x08 ) //写入
{
printf( "关闭刚才写操作的文件.\n" ) ;
ProcessSector = files[ i ].EndSector ;
s = mWriteSector( ProcessSector, 1, FILEBUF );
if ( s != USB_INT_SUCCESS )
return( ERR_Write ) ;
//更新FAT
s = x16List( files[ i ].clus.fat16.EndClus, 0xFFFF, ModeZ1 ) ;
if( s != ListSuccess )
return( s ) ;
//更新目录信息
ProcessSector = files[ i ].find.Sector ;
POINT0 = files[ i ].find.Offset ;
TransNum = files[ i ].find.TransNum ;
printf( " 读取该文件目录信息: \n " ) ;
printf( " ProcessSector = %ld\n ", ProcessSector ) ;
printf( " POINT0 = %p\n ", POINT0 ) ;
printf( " TransNum = %d\n ", ( UINT16 )TransNum ) ;
s = mReadSector( ProcessSector, TransNum, DISKBUF );
if ( s != USB_INT_SUCCESS )
return( ERR_Write ) ;
*( POINT0 + 28 ) = ( UINT8 )files[ i ].FileSize ;
*( POINT0 + 29 ) = ( UINT8 )( files[ i ].FileSize >> 8 ) ;
*( POINT0 + 30 ) = ( UINT8 )( files[ i ].FileSize >> 16 ) ;
*( POINT0 + 31 ) = ( UINT8 )( files[ i ].FileSize >> 24 ) ;
*( POINT0 + 18 ) = ( UINT8 )date ;
*( POINT0 + 19 ) = ( UINT8 )( date >> 8 ) ;
*( POINT0 + 22 ) = ( UINT8 )time ;
*( POINT0 + 23 ) = ( UINT8 )( time >> 8 ) ;
*( POINT0 + 24 ) = ( UINT8 )date ;
*( POINT0 + 25 ) = ( UINT8 )( date >> 8 ) ;
s = mWriteSector( ProcessSector, TransNum, DISKBUF );
if ( s != USB_INT_SUCCESS )
return( ERR_Write ) ;
}
else //读取
{
printf( "关闭刚才读操作的文件.\n" ) ;
//更新目录信息
ProcessSector = files[ i ].find.Sector ;
POINT0 = files[ i ].find.Offset ;
TransNum = files[ i ].find.TransNum ;
printf( " 读取该文件目录信息: \n " ) ;
printf( " ProcessSector = %ld\n ", ProcessSector ) ;
printf( " POINT0 = %p\n ", POINT0 ) ;
printf( " TransNum = %d\n ", ( UINT16 )TransNum ) ;
s = mReadSector( ProcessSector, TransNum, DISKBUF );
if ( s != USB_INT_SUCCESS )
return( ERR_Read ) ;
*( POINT0 + 18 ) = ( UINT8 )date ;
*( POINT0 + 19 ) = ( UINT8 )( date >> 8 ) ;
s = mWriteSector( ProcessSector, TransNum, DISKBUF );
if ( s != USB_INT_SUCCESS )
return( ERR_Write ) ;
}
//删除文件信息结构
files[ i ].Flags = 0x00 ;
//调试语句
#ifdef DEBUG_CLOSE
printf( " 关闭文件成功 ! \n " ) ;
#endif
return( CloseSuccess ) ;
}
/*********************************************************************************************************
** 函数名称: FATCopy
** 功能描述: 复制文件
**
** 输 入: deststr: 为要操作的目标文件名( 路径形式,例如: "/……/……/…….……" )
** scrstr: 为要操作的源文件名( 路径形式,例如: "/……/……/…….……" )
** 输 出: 源文件的数据信息写入到目标文件中
** A.返回ERR_Copy报告异常传输错误
** B.返回CopySuccess则操作成功
**
** 全局变量: FileNums, DiskNums
** 调用模块: FATOpen, x16ReadFile, x16WriteFile, FATClose
** 调试码: DEBUG_CLOSE
**
**
** 作 者: 徐亦朱
** 日 期: 2007年9月21日
**-------------------------------------------------------------------------------------------------------
** 修改人: 徐亦朱
** 日 期: 2007.9.27
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
UINT8 FATCopy( const UINT8 *deststr, const UINT8 *scrstr )
{
UINT8 s ;
UINT8 endflag ;
UINT8 ReadNums ;
UINT16 WriteNums ;
endflag = 0 ;
ReadNums = FileNums ;
WriteNums = DiskNums ;
s = FATOpen( scrstr , ModeB1 ) ;
if ( s != OpenSuccess )
{
printf( " The Open Process Has A BIG WRONG: " ) ;
printf( " ERROR = %02X \n ", ( UINT16 )s );
return( s ) ;
}
s = FATOpen( deststr, ModeB5 ) ;
if ( s != OpenSuccess )
{
printf( " The Open Process Has A BIG WRONG: " ) ;
printf( " ERROR = %02X \n ", ( UINT16 )s );
return( s ) ;
}
while ( 1 )
{
s = x16ReadFile( FileNums, 0 ) ;
if ( s == Clu_End )
WriteNums = files[ 0 ].wr.read.ReadSectors << FAT.shift ;
else if ( s == File_End )
{
WriteNums = files[ 0 ].ShortLength ? ( ( ( files[ 0 ].wr.read.ReadSectors - 1 ) << FAT.shift ) + files[ 0 ].ShortLength ) : ( files[ 0 ].wr.read.ReadSectors << FAT.shift ) ;
printf( " WriteNums = %d\n ", WriteNums ) ;
endflag = 1 ;
printf( " The Copy will end !\n " ) ;
}
else if ( s != ReadSuccess )
{
printf( " The Read Process Has A BIG WRONG: " ) ;
printf( " ERROR = %02X \n ", ( UINT16 )s );
return( s ) ;
}
else
WriteNums = DISKBUF_BYTES ;
s = x16WriteFile( WriteNums, 1 ) ;
if ( s != WriteSuccess )
{
printf( " The Write Process Has A BIG WRONG: " ) ;
printf( " ERROR = %02X \n ", ( UINT16 )s );
return( s ) ;
}
if ( endflag )
break ;
}
s = FATClose( 0 ) ;
if ( s != CloseSuccess )
{
printf( " The Close Process Has A BIG WRONG: " ) ;
printf( " ERROR = %02X \n ", ( UINT16 )s );
return( s ) ;
}
s = FATClose( 1 ) ;
if ( s != CloseSuccess )
{
printf( " The Close Process Has A BIG WRONG: " ) ;
printf( " ERROR = %02X \n ", ( UINT16 )s );
return( s ) ;
}
return( CopySuccess ) ;
}
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -