发布时间 : 星期日 文章基于c语言的文件系统FAT16操作源代码更新完毕开始阅读41ce5434f111f18583d05a7f
{
uint8 i, *a = A, *b = B; for(i = 0; i < Size; i++) if(a[i] != b[i]) return 0; return 1; }
//*********************************************************************************** void EmptyBytes(void* D, uint16 size)
//*********************************************************************************** {
uint16 i;
uint8* data = (uint8*)D; for(i = 0; i < size; i++) {
*data++ = 0; } }
//********************************************************************************** //读取BPB数据结构 void ReadBPB(void)
//*********************************************************************************** {
FAT_BPB* BPB = (FAT_BPB*)BUFFER; ReadBlock(0);
//获取参数
BPB_BytesPerSec = BPB->BPB_BytesPerSec; BPB_SecPerClus = BPB->BPB_SecPerClus; BPB_RsvdSecCnt = BPB->BPB_RsvdSecCnt; BPB_NumFATs = BPB->BPB_NumFATs;
BPB_RootEntCnt = BPB->BPB_RootEntCnt; BPB_TotSec16 = BPB->BPB_TotSec16; BPB_FATSz16 = BPB->BPB_FATSz16; BPB_HiddSec = BPB->BPB_HiddSec; }
//************************************************************************************* //获取根目录开始扇区号 uint32 DirStartSec(void)
//************************************************************************************* {
return BPB_RsvdSecCnt + BPB_NumFATs * BPB_FATSz16;
5
}
//************************************************************************************ //获取数据区开始扇区号 uint32 DataStartSec(void)
//************************************************************************************ {
return (uint32)(DirStartSec() + BPB_RootEntCnt * 32 / BPB_BytesPerSec); }
//************************************************************************************ //目录项占用的扇区数
uint16 GetDirSecCount(void)
//************************************************************************************ {
return BPB_RootEntCnt * 32 / 512; }
//************************************************************************************ //获取一个簇的开始扇区
uint32 ClusConvLBA(uint16 ClusID)
//************************************************************************************* {
return DataStartSec() + BPB_SecPerClus * (ClusID - 2); }
//************************************************************************************* //读取文件分配表的指定项 uint16 ReadFAT(uint16 Index)
//*********************************************************************************** {
uint16 *RAM = (uint16*)BUFFER;
ReadBlock(BPB_RsvdSecCnt + Index / 256); return RAM[Index % 256]; }
//*********************************************************************************** //写文件分配表的指定项
void WriteFAT(uint16 Index, uint16 Value)
//*********************************************************************************** {
uint16 *RAM = (uint16*)BUFFER; uint32 SecID;
SecID = BPB_RsvdSecCnt + Index / 256; ReadBlock(SecID);
RAM[Index % 256] = Value;
6
WriteBlock(SecID); }
//*********************************************************************************** //获取根目录中可以使用的一项 uint16 GetEmptyDIR()
//*********************************************************************************** {
uint16 DirSecCut, DirStart, i, m, ID = 0; DirSecCut = GetDirSecCount(); DirStart = DirStartSec();
for(i = 0; i < DirSecCut; i++) {
ReadBlock(DirStart + i); for(m = 0; m < 16; m++) {
if((BUFFER[m * 32] == 0) || (BUFFER[m * 32] == 0xe5)) return ID; else
ID++; } }
return ID; }
//************************************************************************************ //获得和文件名对应的目录项
uint8 GetFileID(uint8 Name[11], DIR* ID)
//************************************************************************************ {
uint16 DirSecCut, DirStart, i, m; DirSecCut = GetDirSecCount(); DirStart = DirStartSec();
for(i = 0; i < DirSecCut; i++) {
ReadBlock(DirStart + i); for(m = 0; m <16; m++) {
if(IsEqual(Name, &((DIR*)&BUFFER[m * 32])->FileName, 11)) {
*ID = *((DIR*)&BUFFER[m * 32]);
return 1; //找到对应的目录项,返回1. } } }
return 0; //没有找到对应的目录项,返回0.
7
}
//************************************************************************************** //获取一个空的FAT项 uint16 GetNextFAT(void)
//************************************************=************************************* {
uint16 FAT_Count, i;
FAT_Count = BPB_FATSz16 * 256; //FAT表总项数 for(i = 0; i < FAT_Count; i++) {
if(ReadFAT(i) == 0) return i; }
return 0; }
//************************************************************************************** //读取根目录的指定项
void ReadDIR(uint16 Index, DIR* Value)
//************************************************************************************ {
uint32 DirStart = DirStartSec(); ReadBlock(DirStart + Index / 16);
CopyBytes(&BUFFER[(Index % 16) * 32], Value, 32); }
//************************************************************************************* //写根目录的指定项
void WriteDIR(uint16 Index, DIR* Value)
//************************************************************************************* {
uint32 LBA = DirStartSec() + Index / 16; ReadBlock(LBA);
CopyBytes(Value, &BUFFER[(Index % 16) * 32], 32); WriteBlock(LBA); }
//************************************************************************************* //创建一个空文件
void CreateFile(uint8* FileName[11], uint32 Size)
//************************************************************************************* {
uint16 ClusID, ClusNum, ClusNext, i; DIR FileDir;
ClusNum = Size / (BPB_SecPerClus * 512) + 1; EmptyBytes(&FileDir, sizeof(DIR));
8