📄 fat.h
字号:
/*************************************Seekfor FAT System v1.2**************************************************************************
********************* ********************************* ********************* v1.2
******* ********** ******* ******** ******* ***********
******* ******* ******* ******* ******** *******
******* ******* ******* ********
******* ******* ******* ********
******* ******* ******* ********
*********** ************************* ***********
*********** ******* ******* ***********
******* ******* ******* *******
******* ******* *******
******* ******* ******* ******** *******
******* ******* ******* ******** *******
******* ******* ******* ******** *******
********** ******* ******* *********** *******
********************* *************** **********************
Seekfor FAT system v1.2是移植性非常强的一个嵌入式FAT16/FAT32文件系统软件包,支持多个物理驱动器,完全兼容DOS下的文件系统,支持多任务下的文件操作.
<1>和SFS v1.0比较,SFS v1.2增加以下特性:
1.增强了错误处理功能
2.增加了FAT_format()功能
3.开始支持扩展分区
4.开始支持长文件的显示(暂不支持用长文件名访问文件),Windows下建立的长文件名可以正常显示
5.取消v1.0中的物理驱动器概念,所有驱动器都看做逻辑驱动器
5.修正v1.0中扇区计算不对不兼容Windows的bug
6.修正FAT32根目录起始位置固定的bug
<2>更新软件请联系:
QQ:82054357
MSN:sfrad32@hotmail.com
Mail:Seek_for@163.com
<3>本文件说明
a.文件名:fat.h
b.功能:系统头文件,自定义选项,全局函数原型,常量定义等
**************************************************************************************************************************************/
#ifndef __FAT_H__
#define __FAT_H__
/*是否支持扩展分区,1=支持,0=不支持*/
#define SUPPORT_EXT_PARTITION 0
/*是否支持长文件名(当前版本不支持,必须为0)*/
#define SUPPORT_LONG_NAME 1
/*是否支持格式化功能,1=支持,0=不支持*/
#define SUPPORT_FORMAT 1
/*建立文件夹的时候是否建立"."和".."目录,1=建立,0=不建立*/
#define CREATE_DOT_ENTRY 1
/*默认的format参数*/
#define DEFAULT_BYTES_PER_SECTOR 512/*每扇区字节数,一般为512*/
#define DEFAULT_RESERVED_SECTORS 2/*保留的扇区数,一般为2,必须>=1*/
#define DEFAULT_ROOT_ENTRY 2/*FAT16保留的根目录簇数,一般为2即可(2的话表示根目录最多512个目录项)*/
/*驱动器开始盘符*/
#define START_DRIVER_LABLE 'C'
/*最多支持的驱动器数目*/
#define MAX_DRIVERS_NUMBER 24
/*是否必须在写扇区前擦除,1=必须,0=不必*/
#define MUST_ERASE_BEFORE_WRITE 1
#define BYTE unsigned char
#define WORD unsigned short
#define DWORD unsigned int
#define BOOL DWORD
/*文件访问模式*/
#define O_READ 0x0001
#define O_WRITE 0x0002
#define O_APPEND 0x0006
#define O_BINARY 0x0008
#define O_TEXT 0x0010
/*文件属性*/
#define ATTR_READONLY 0x01
#define ATTR_HIDDEN 0x02
#define ATTR_SYSTEM 0x04
#define ATTR_VOLUME_ID 0x08
#define ATTR_DIRECTORY 0x10
#define ATTR_ARCHIVE 0x20
#define ATTR_LONG_NAME (0x01|0x02|0x04|0x08)
/*seek功能*/
#define SEEK_SET 0
#define SEEK_CUR 1
#define SEEK_END 2
/*扇区擦除函数指针*/
typedef BOOL (*SECTOR_ERASE)(DWORD dwSectors,DWORD dwSectorSize,void*user_data);
/*扇区读函数指针*/
typedef BOOL (*SECTOR_READ)(DWORD dwSectors,BYTE*buff,DWORD dwSectorSize,void*user_data);
/*扇区写函数指针*/
typedef BOOL (*SECTOR_WRITE)(DWORD dwSectors,BYTE*buff,DWORD dwSectorSize,void*user_data);
typedef struct
{
void*prev;
void*next;
DWORD dwSectors;
BYTE name[12];
}LINK,*PLINK;
typedef struct
{
BOOL bFAT32;/*是否FAT32,0=FAT16,1=FAT32*/
DWORD dwHideSectorStart;/*隐藏扇区开始号*/
DWORD dwReservedSectorStart;/*保留扇区开始号*/
DWORD dwFATSectorStart[2];/*FAT1开始扇区号*/
DWORD dwRootSectorStart;/*根目录开始扇区号*/
DWORD dwDataSectorStart;/*数据开始扇区号*/
DWORD dwNumFATs;/*FAT表总数*/
DWORD dwFATsZ;/*FAT表扇区总数*/
DWORD dwVOLID;/*卷标ID*/
#if(SUPPORT_LONG_FILENAME==1)
BYTE VolLable[255];/*卷标*/
#else
BYTE VolLable[13];/*卷标*/
#endif
BYTE DriverName;/*驱动器名称*/
DWORD dwTotalClusters;/*簇总数*/
DWORD dwFreeClusters;/*空闲簇总数*/
PLINK lpLinks;/*路径双向连表*/
PLINK lpCurrentDir;/*当前目录连表指针,指向lpLinks的最后一个节点*/
DWORD dwBytesPerSector;/*每扇区字节数目*/
DWORD dwSectorsPerCluster;/*每簇扇区数目*/
void* user_data;/*用户数据指针*/
SECTOR_READ lpfnRead;/*扇区读指针*/
SECTOR_WRITE lpfnWrite;/*扇区写指针*/
SECTOR_ERASE lpfnErase;/*扇区擦除指针*/
}DRIVER_INFO;
typedef struct
{
BYTE lpszShortName[12];
#if(SUPPORT_LONG_NAME==1)
BYTE lpszLongName[256];
#endif
DWORD dwCurrentPosition;/*文件当前位置*/
DWORD dwFileLength;/*文件长度*/
WORD dwAttr;/*文件属性*/
WORD dwMode;/*文件打开模式*/
DWORD dwFirstCluster;/*第一个簇号*/
DWORD dwCurrentCluster;/*当前正在读写的簇号*/
DWORD dwDirectoryEntrySector;/*文件名入口扇区号*/
DWORD dwDirectoryEntryOffset;/*文件名入口偏移*/
BYTE lpszDir[32];/*32个字节的文件入口信息*/
BYTE*lpszBuffers;/*簇内容缓冲区*/
DWORD dwIndexs;/*缓冲区指针*/
DRIVER_INFO*driver;/*文件所在的驱动器指针*/
}FILE;
typedef struct
{
BYTE year;
BYTE month;
BYTE day;
BYTE week;
}FAT_DATE;
typedef struct
{
BYTE hour;
BYTE minute;
BYTE second;
BYTE millsecond;
}FAT_TIME;
typedef struct
{
/*********内部使用数据***************************/
BYTE ff_name1[8];/*主文件名*/
BYTE ff_name2[3];/*扩展名*/
BYTE attr; /*要查找的属性*/
DWORD prev_cluster;/*上次的簇*/
DWORD orig_sector;/*原始扇区*/
DWORD prev_sector;/*上次查找过的扇区号*/
WORD prev_index;/*上次查找过的入口偏移*/
DRIVER_INFO* driver;/*当前驱动器指针*/
/***********************************************/
WORD ff_time;/*查找到的文件修改时间*/
WORD ff_date;/*查找到的文件修改日期*/
DWORD ff_size;/*查找到的文件大小*/
char ff_name[13];/*8.3文件名称*/
BYTE ff_attrib;/*查找到的文件属性*/
#if(SUPPORT_LONG_NAME==1)
char ff_longname[256];
#endif
}ffblk;
typedef struct
{
DWORD df_avail;
DWORD df_total;
DWORD df_bsec;
DWORD df_sclus;
}dfree;
#ifdef __cplusplus
extern "C"
{
#endif
/*portable.c API*/
void*SYS_malloc(DWORD size);
void SYS_free(void*);
FAT_DATE SYS_getdate();
FAT_TIME SYS_gettime();
#if(SUPPORT_LONG_NAME==1)
BOOL Unicode2Ascii(BYTE*unicode,BYTE*ascii);
#endif
/*fat.c API*/
DWORD FAT_install(SECTOR_ERASE,SECTOR_READ,SECTOR_WRITE,void*);
void FAT_terminate();
BOOL FAT_format(DRIVER_INFO*,BOOL,DWORD,DWORD,SECTOR_ERASE,SECTOR_READ,SECTOR_WRITE,void*user_data);
/*stdio.h兼容API*/
FILE* fopen(char*,char*);
int fclose(FILE*);
int fgetc(FILE*);
int fputc(int c,FILE*p);
char*fgets(char*s,int n,FILE*p);
int fputs(char*s,FILE*p);
int fread(void*,unsigned int,unsigned int,FILE*);
int fwrite(void*,unsigned int,unsigned int,FILE*);
long ftell(FILE*p);
int feof(FILE*);
int chdir(BYTE*);
int rmdir(BYTE*);
int mkdir(BYTE*);
int getcurdir(int,BYTE*);
int findfirst(BYTE*,ffblk*,BYTE);
int findnext(ffblk*);
void getdfree(unsigned char driver,dfree*table);
int rename(BYTE*,BYTE*);
int remove(BYTE*);
int fseek(FILE*,long,int);
/*额外功能支持API*/
int attrib(BYTE*,BYTE);
int label(BYTE,char*);
#ifdef __cplusplus
}
#endif
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -