📄 fdt.c
字号:
/*
;*****************************************************************************************************
;* Copyright (c) 2006 by JiaoJinXing.
;* All rights reserved.
;*
;*---- 文件信息 --------------------------------------------------------------------------------------
;* 文 件 名 : fdt.c
;* 创 建 人 : 焦进星
;* 描 述 : 根目录项文件
;*
;*---- 历史版本信息 ----------------------------------------------------------------------------------
;* 日 期 : 2008年 12 月 15 日
;* 创 建 人 : 焦进星
;* 描 述 : 建立版本 V1.0.0
;*
;*---- 联系方式 --------------------------------------------------------------------------------------
;* Email : wyoujtg@163.com
;* Web : http://wyoujtg.blog.163.com
;*****************************************************************************************************
;*/
#include "minifs.h"
/*
;*****************************************************************************************************
;* 函数名称 : ReadRootFDTInfo
;* 描 述 : 读取指定根目录项
;* 输 入 : FDTIndex: 目录项索引, pFDT: 目录项指针
;*
;* 输 出 : TRUE OR FALSE
;*****************************************************************************************************
;*/
uint8 ReadRootFDTInfo(uint16 FDTIndex, FDT *pFDT)
{
uint16 SecIndex, ByteOffset;
uint8 *Buf;
if (FDTIndex >= MAX_FDT_NUM) /* 索引无效 */
{
return FALSE;
}
SecIndex = FDTIndex*32 / 512 + FS_RootDirStartSec;/* 扇区号 */
ByteOffset = FDTIndex*32 % 512; /* 字节偏移 */
Buf = OpenSector(SecIndex); /* 打开扇区 */
if (Buf == NULL)
{
return FALSE;
}
Buf += ByteOffset; /* 调整扇区读写指针 */
CopyNbyte(pFDT->Name, Buf, 11); /* 名字 */
pFDT->FstClusLO = GET_UINT16(Buf, 26); /* 首簇号 */
pFDT->FileSize = GET_UINT16(Buf, 28); /* 大小 */
return TRUE;
}
/*
;*****************************************************************************************************
;* 函数名称 : WriteRootFDTInfo
;* 描 述 : 写指定根目录项
;* 输 入 : FDTIndex: 目录项索引, pFDT: 目录项指针
;*
;* 输 出 : TRUE OR FALSE
;*****************************************************************************************************
;*/
uint8 WriteRootFDTInfo(uint16 FDTIndex, FDT *pFDT)
{
uint16 SecIndex, ByteOffset;
uint8 *Buf;
if (FDTIndex >= MAX_FDT_NUM) /* 索引无效 */
{
return FALSE;
}
SecIndex = FDTIndex*32 / 512 + FS_RootDirStartSec;/* 扇区号 */
ByteOffset = FDTIndex*32 % 512; /* 字节偏移 */
Buf = OpenSector(SecIndex); /* 打开扇区 */
if (Buf == NULL)
{
return FALSE;
}
Buf += ByteOffset; /* 调整扇区读写指针 */
CopyNbyte(Buf, pFDT->Name, 11); /* 名字 */
SET_UINT16(Buf, 26, pFDT->FstClusLO); /* 首簇号 */
SET_UINT16(Buf, 28, pFDT->FileSize); /* 大小 */
WriteSector(); /* 写扇区 */
return TRUE;
}
/*
;*****************************************************************************************************
;* 函数名称 : GetFreeRootFDT
;* 描 述 : 分配一个空闲根目录项
;* 输 入 : 无
;*
;* 输 出 : 目录项索引
;*****************************************************************************************************
;*/
uint16 GetFreeRootFDT(void)
{
uint16 i;
FDT pFDT;
for (i = 0; i < MAX_FDT_NUM; i++)
{
ReadRootFDTInfo(i, &pFDT); /* 读取第i个根目录项 */
if (pFDT.Name[0] == 0xE5 || pFDT.Name[0] == 0x00) /* 空闲 */
{
break;
}
}
return i; /* 返回目录项索引 */
}
/*
;*****************************************************************************************************
;* 函数名称 : FileNameChange
;* 描 述 : 将外部文件名转化为内部文件名
;* 输 入 : NameStr: 外部文件名, Filename: 内部文件名
;*
;* 输 出 : TRUE OR FALSE
;*****************************************************************************************************
;*/
uint8 FileNameChange(char *NameStr, char Filename[11])
{
uint8 i, z;
uint8 extp = 0, len= 0;
uint8 ch;
if (NameStr == NULL)
{
return FALSE;
}
/* 名首不能为空格和'.'及空 */
ch = *NameStr;
if (ch == ' ' || ch == '.' || ch == '\0')
{
return FALSE;
}
while ( (len < 11) && ((ch = *NameStr) != '\0') )
{
switch (ch)
{
case 0x22:
case 0x2A:
case 0x2B:
case 0x2C:
case 0x2F:
case 0x3A:
case 0x3B:
case 0x3C:
case 0x3D:
case 0x3E:
case 0x3F:
case 0x5B:
case 0x5C:
return FALSE;
}
/* 小写转大写 */
if (ch >= 'a' && ch <= 'z')
{
ch -= 'a' - 'A';
}
/* 找到第一个扩展名标识'.' */
if (ch == '.' && extp == 0)
{
extp = len; /* 记下它的位置 */
}
Filename[len] = ch; /* 记录 */
len++;
NameStr++;
}
if (extp != 0) /* 有扩展名 */
{
i = len - 1; /* 名字末字节位置 */
/* 将扩展名移到最后 */
for (z = 10; i > extp; i--, z--)
{
Filename[z] = Filename[i];
}
/* 中间填入空格 */
for (; z >= extp; z--)
{
Filename[z] = ' ';
}
}
else /* 无扩展名 */
{
i = len; /* 名字后的位置 */
for (; i < 11; i++) /* 余下的空间填入空格 */
{
Filename[i] = ' ';
}
}
return TRUE;
}
/*
;*****************************************************************************************************
;* 函数名称 : FindSYSNameRootFDT
;* 描 述 : 查找指定内部名字的根目录项
;* 输 入 : Filename[11]: 内部文件名
;*
;* 输 出 : 目录项索引
;*****************************************************************************************************
;*/
uint16 FindSYSNameRootFDT(char Filename[11], FDT *pFDT)
{
uint16 i;
for (i = 0; i < MAX_FDT_NUM; i++)
{
if (!ReadRootFDTInfo(i, pFDT)) /* 读取第i号根目录项 */
{
return FDT_NO_FOUND;
}
if (IsEqual(Filename, pFDT->Name, 11)) /* 同名,找到 */
{
break;
}
}
return i;
}
/*
;*****************************************************************************************************
;* 函数名称 : FindUSERNameRootFDT
;* 描 述 : 查找指定外部名字的根目录项
;* 输 入 : NameStr[11]: 外部文件名
;*
;* 输 出 : 目录项索引
;*****************************************************************************************************
;*/
uint16 FindUSERNameRootFDT(char NameStr[11], FDT *pFDT)
{
char Filename[11];
if (!FileNameChange(NameStr, Filename)) /* 将外部名字转化为内部名字 */
{
return FDT_NO_FOUND;
}
return FindSYSNameRootFDT(Filename, pFDT); /* 查找内部名字的根目录项 */
}
/*
;*****************************************************************************************************
;* End of File
;*****************************************************************************************************
;*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -