发布时间 : 星期日 文章基于c语言的文件系统FAT16操作源代码更新完毕开始阅读41ce5434f111f18583d05a7f
文件: FAT.H
//微控设计网原创 www.Microcontrol.cn 作者: debug版主 typedef unsigned char uint8; typedef unsigned int uint16; typedef unsigned long uint32;
#pragma pack(1)
typedef struct {
uint8 BS_jmpBoot[3]; uint8 BS_OEMName[8]; uint16 BPB_BytesPerSec; uint8 BPB_SecPerClus; uint16 BPB_RsvdSecCnt; uint8 BPB_NumFATs; uint16 BPB_RootEntCnt; uint16 BPB_TotSec16; uint8 BPB_Media; uint16 BPB_FATSz16; uint16 BPB_SecPerTrk; uint16 BPB_NumHeads; uint32 BPB_HiddSec; uint32 BPB_TotSec32; uint8 BS_DrvNum; uint8 BS_Reservedl; uint8 BS_BootSig; uint32 BS_VolID; uint8 BS_VolLab[11]; uint8 BS_FilSysType[8]; uint8 ExecutableCode[448]; uint8 ExecutableMarker[2]; } FAT_BPB; typedef struct {
uint8 NAME[8]; uint8 TYPE[3]; } FILE_NAME; typedef struct {
uint16 Start; uint32 Size; } FILE_POSIT; typedef struct {
1
FILE_NAME FileName; uint8 FileAttrib; uint8 UnUsed[10];
uint8 FileUpdateTime[2]; uint8 FileUpdateData[2]; FILE_POSIT FilePosit; } DIR;
typedef struct {
uint16 ClusID; uint16 SecOfClus; uint16 ByteOfSec; } DATA_POSIT;
#pragma pack()
//************************************************************************** //读一个扇区
void ReadBlock(uint32 LBA);
//************************************************************************** //写一个扇区
void WriteBlock(uint32 LBA);
//************************************************************************** void CopyBytes(void* S, void* D, uint16 size);
//************************************************************************** uint8 IsEqual(void* A, void* B, uint8 Size);
//************************************************************************* void EmptyBytes(void* D, uint16 size);
//************************************************************************** //读取BPB数据结构 void ReadBPB(void);
//*************************************************************************** //获取根目录开始扇区号 uint32 DirStartSec(void);
//**************************************************************************** //获取数据区开始扇区号 uint32 DataStartSec(void);
//*************************************************************************** //目录项占用的扇区数
uint16 GetDirSecCount(void);
//**************************************************************************** //获取一个簇的开始扇区
uint32 ClusConvLBA(uint16 ClusID);
//**************************************************************************** //读取文件分配表的指定项
uint16 ReadFAT(uint16 Index);
2
//**************************************************************************** //写文件分配表的指定项
void WriteFAT(uint16 Index, uint16 Value);
//************************************************************************** //获取根目录中可以使用的一项 uint16 GetEmptyDIR(void);
//**************************************************************************** //获得和文件名对应的目录项
uint8 GetFileID(uint8 Name[11], DIR* ID);
//*************************************************************************** //获取一个空的FAT项 uint16 GetNextFAT(void);
//**************************************************************************** //读取根目录的指定项
void ReadDIR(uint16 Index, DIR* Value);
//**************************************************************************** //写根目录的指定项
void WriteDIR(uint16 Index, DIR* Value);
//**************************************************************************** //创建一个空文件
void CreateFile(uint8* FileName[11], uint32 Size);
//************************************************************************ //复制文件分配表,使其和备份一致 void CopyFAT(void);
//**************************************************************************** //操作文件的数据
void OperateFile(uint8 Write ,uint8 Name[11], uint32 Start, uint32 Length, void* Data); //-------------------------------------------------------------------------------
3
文件:FAT.C
//微控设计网原创 www.Microcontrol.cn 作者: debug版主 #include
uint8 BUFFER[512];
uint16 BPB_BytesPerSec; uint8 BPB_SecPerClus; uint16 BPB_RsvdSecCnt; uint8 BPB_NumFATs; uint16 BPB_RootEntCnt; uint16 BPB_TotSec16; uint16 BPB_FATSz16; uint32 BPB_HiddSec;
//******************************************************************************** //读一个扇区
void ReadBlock(uint32 LBA)
//******************************************************************************** {
return; }
//******************************************************************************** //写一个扇区
void WriteBlock(uint32 LBA)
//******************************************************************************** {
return; }
//******************************************************************************** void CopyBytes(void* S, void* D, uint16 size)
//******************************************************************************** {
uint8 *s = S, *d = D; uint16 i;
for(i = 0; i < size; i++) *d++ = *s++; }
//********************************************************************************* uint8 IsEqual(void* A, void* B, uint8 Size)
//**********************************************************************************
4