⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fat.h

📁 针对以arm处理器为核心的嵌入式平台的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 + -