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