TQFS泛型文件管理层(第三层)驱动

第一层为NandFlash驱动层,第二层规定TAB文件表与文件内容页的关联关系,第三层提供机器操作文件的接口针对页读写,第四层提供标准的类似于window的文件管理接口

文件类型分为以下几种,创建的泛型文件容器可以用来存储文件夹、文件、链接等文件类型,并且长度可以为变长、固定长、
enum FileType{
 FT_ReadyRoom=0xef,//未定义长度的泛型文件存储区
 FT_File=0x1f,//文件类型的未定义长度存储区
 FT_FileHead=0x1e,//文件首
 FT_FileCoutext=0x1c,//文件中
 FT_FileEnd=0x18,//文件尾部
 FT_Folde=0x2f,//文件夹类型的未定义长度存储区
 FT_FolderHead=0x2e,
 FT_FolderCoutext=0x2c,
 FT_FolderEnd=0x28,
 FT_Link=0x3f,//链接类型的未定义长度存储区
 FT_LinkHead=0x3e,
 FT_LinkCoutext=0x3c,
 FT_LinkEnd=0x38,
};

文件信息File_File存在于文件内容区的每个被使用的内容页的Spare区域的首部,用来描述该页的内容详细信息
typedef struct
{
 uint8  Page_Status;//该区域为页最重要的位置
 uint8  FileType;//该页内容类型
 uint8  PS_ST;//页状态暂时未使用
 uint8  FileName[14];//文件名长度为14个字节
 uint8  FileFormat[6];//文件格式
 uint8  FileVirtue;//文件属性
 Date_Time CreateDate;//文件创建时间
 Date_Time ReBuildDate;//文件修改时间
 uint32 PreviousPageAddr;//上一页的相对地址
 uint32 NextPageAddr;//下一页的相对地址
 uint32 FileSize;//该文件总长度(变长文件该值为0xfffffff)
 uint16 DataLegnth;//当前页内容长度   偏移地址为SpareLength+2字节长度
 uint32 FileID;//文件ID等于文件头所在页的相对位置
 uint16 SpareCrc;这是在整个页面被使用完后处理的  File_Infor除去校验码以外的crc数据校验值
 uint16 PageCrc;这是在整个页面被使用完后处理的  文件内容页的数据校验值
 
}File_Infor;//文件头结构体//文件头页不存放任何文件内容,只存放文件信息

#include
#include
#include



TQFS_Open_File Open_File;
uint8 TQFS_FileDelete(uint8 *Path)
{
 StringCoppy(Path,&Open_File.Path[0]);
 return 0;
}

void TQFS_FileRoomInfor(File_Infor *FI,void *File,uint32 FileSize,uint8 FileVirtue)
{
 uint8 Buf[14];
 BufferFill(FI,0xff,sizeof(File_Infor));//配置不设置项为不修改状态
 GetFileName(File,&Buf[0]);
 StringCoppy(&Buf[0],&FI->FileName[0]);
 GetFileFormat(File,&Buf[0]);
 StringCoppy(&Buf[0],&FI->FileFormat[0]);
 FI->FileType=FT_ReadyRoom;//待分配的文件类型
 BufferCoppy(&NowTime,&FI->CreateDate,sizeof(Date_Time));
 FI->Page_Status=PS_BeUse;//页即将被使用
 if(FileSize)FI->FileSize=FileSize;
 //FI->FileID=rand();//文件ID其实就是随机数,但必须保证同一个文件的ID号相同
 FI->FileVirtue=FileVirtue;//可读可写隐藏等属性 
}

uint32 TQFS_CreateFileRoom(uint32 Page,File_Infor *FI)
{
 FI->FileID=Page;
 DeBug("Create Object File In Page[%d]",Page,Infor_Infor);
 Write_FileInfor(Page,FI);
 TQFS_SetCursor(Page,0);
 return 0;
}

void TQFS_SetCursor(uint32 Page,uint16 Offset)
{
 Open_File.PageCursor=Page;
 Open_File.OffsetCursor=Offset;
}

TQFS_Error TQFS_ReadPageContext(uint8 *rBuffer,uint16 Length)
{
 File_Infor TempFile;
 int OviLenth;
 uint16 Offset=0;
  OviLenth=(Open_File.OffsetCursor+Length);
 OviLenth-=NAND_PAGE_SIZE;//写不下的长度
 if(OviLenth>=0)//当前页不够
 {
  Nand_ReadPage(Nand_Infor.FileStartPage+Open_File.PageCursor,&rBuffer[Offset],Open_File.OffsetCursor+NAND_SPARE_SIZE,Length-OviLenth);
  Offset=Length-OviLenth;
  Open_File.OffsetCursor=0;
  Read_FileInfor(Open_File.PageCursor,&TempFile);
  if(TempFile.NextPageAddr==0xffffffff)return TE_NoNextPage;
  else{
   Open_File.PageCursor=TempFile.NextPageAddr;
   Length=OviLenth;
    
 }
  Nand_ReadPage(Nand_Infor.FileStartPage+Open_File.PageCursor,&rBuffer[Offset],Open_File.OffsetCursor+NAND_SPARE_SIZE,Length);
  Open_File.OffsetCursor+=Length;
 if(OviLenth>=0)return TE_NewPage;
 else return TE_CurrentPage;
}

TQFS_Error TQFS_WritePageContext(uint8 *Buffer,uint16 Length)
{
 File_Infor TempFile;
 int OviLenth;
 uint16 Offset=0;
  OviLenth=(Open_File.OffsetCursor+Length);
 OviLenth-=NAND_PAGE_SIZE;//写不下的长度
 if(OviLenth>=0)//当前页不够
 {
  Nand_WritePage(Nand_Infor.FileStartPage+Open_File.PageCursor,&Buffer[Offset],Open_File.OffsetCursor+NAND_SPARE_SIZE,Length-OviLenth);
  Offset=Length-OviLenth;
  Open_File.OffsetCursor=0;
  Read_FileInfor(Open_File.PageCursor,&TempFile);
  TempFile.NextPageAddr=TQFS_FindFirstUsingPage(0);//页不够时寻找下一个空页
  TempFile.Page_Status=PS_UsedFully;//标记页被使用完
  Write_FileInfor(Open_File.PageCursor,&TempFile);//在当前页写入下页地址
  Open_File.PageCursor=TempFile.NextPageAddr;
   TempFile.Page_Status=PS_NotFully;
  TempFile.PreviousPageAddr=Open_File.PageCursor;
  TempFile.NextPageAddr=0xffffffff;
  Write_FileInfor(Open_File.PageCursor,&TempFile);//在当前页写入下页地址
  Open_File.PageCursor=TempFile.NextPageAddr;
  Length=OviLenth;  
 }
  Nand_WritePage(Nand_Infor.FileStartPage+Open_File.PageCursor,&Buffer[Offset],Open_File.OffsetCursor+NAND_SPARE_SIZE,Length);
  Open_File.OffsetCursor+=Length;
 if(OviLenth>=0)return TE_NewPage;
 else return TE_CurrentPage;
}
uint8 TQFS_FileCreate(uint8 *Path,uint8 State)
{
 
 
 return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值