Seekfor_FAT_System_v1_2
所属分类:处理器开发
开发工具:DOS
文件大小:54KB
下载次数:8
上传日期:2007-09-29 19:23:31
上 传 者:
xialibaren
说明: 针对以arm处理器为核心的嵌入式平台的fat文件系统
(To arm processors for the embedded platform at the core of the fat file system)
文件列表:
include\fat.h (8567, 2006-08-26)
include (0, 2006-08-15)
source\fat.c (99865, 2006-08-26)
source\portable.c (114060, 2006-08-26)
source (0, 2006-08-15)
Seekfor FAT System v1.1使用指南
================================================================================================================
1.简介
Seekfor FAT System v1.1是Seekfor 开发的一款嵌入式FAT16/FAT32文件系统支持软件,该软件包
完全支持FAT16/FAT32,支持多个分区和多个物理驱动器,同时提供基本兼容stdio.h的API.这样使用FAT系统就
非常简单了.例如,只要你正确调用了FAT_install(),那么以后就可以直接使用fopen("C:\\mp3\\demo.mp3","rb")
+fread()+fclose()来操作C:\mp3\demo.mp3文件了.如果你有多个物理驱动器或多个分区,那么和DOS一样,系统也
依此映射为C:,D:,E:等等,最多能有26个逻辑驱动器
===============================================================================================================
2.系统要求
要移植Seekfor FAT System v1.1,首先,您的系统必须提供类似malloc(),free()动态内存分配的机制.同时因为
stdio.h使用的是缓冲式(预读式)文件读写,也就是说,读文件的时候会先读出一部分数据到缓冲区,写的时候是先写到
内存缓冲区中,所以需要您的系统有足够的内存.在当前版本,每一个打开的文件都有一簇内容的缓冲.所以每个文件所需
的缓冲区大小是FAT系统中的每簇扇区数X每扇区字节数得到的.因此在多任务环境,如果您需要打开多个文件,则必须保证
您的内存足够(当然如果内存不够的情况下,fopen()是返回NULL的).其次,建立文件或者建立文件夹需要指定建立的时间,
日期等信息,因此您的系统也应该提供能获取系统日期和系统时间的函数,最后,您的系统能正确完成扇区擦除,扇区读和扇区
写功能
===============================================================================================================
3.软件结构
(1)FAT层API
提供FAT_install(),FAT_terminate(),FAT_format()三个函数
(2)文件层API
提供基本兼容stdio.h的文件操作函数,添加一部分stdio.h不存在但需要使用的函数,如int attrib(char*filename,char attr)实现对文件或者文件夹更改属性,int label(char*new_label)实现更改卷标名等功能
(3)移植层API
定义在source\\portable.c中,这是需要用户自己重写的一些函数,源文件中的函数是实现在Win32下的代码
========================================================================================================================
4.和stdio.h的差异部分
(1)findfirst()和findnext()中使用的结构ffblk和stdio.h有差异,您可以对比fat.h中ffblk的定义和Turbo C中ffblk 中的定义
(2)stdio.h的fopen(char*filename,char*mode)中的文件打开模式mode支持"t"和"b",也就是文件有二进制文件和文本文件的区分
实际上个人感觉仅仅是\r\n上的处理(读文件读到\n会自动转化为\r\n,写文件写到\r\n只会写入\n),在现在存储容量较大的情况下,已经没有
什么必要支持此功能了.所以本软件包就不再支持"t"和"b"了.
========================================================================================================================
5.个人说明
您可以***使用,传播该软件,但不得更改软件中的所有关于本人的信息.传播该软件必须附带这个未修改的readme.txt文件.
本软件已在Visual C++下编译通过,对本软件格式化,或者建立的文件,文件夹,把*.img写入到优盘后,Win CE能够正确识别和读出.但当前版本没有支持长文件名,或许
下一个版本会支持这功能的.
如果您有任何意见和建议,或者发现软件的BUG,请联系:
Email:Seek_for@163.com,sfrad32@hotmail.com
QQ:82054357
===========================================================================================================================
6.移植示范
(1)第一步:改写source\portable.c中的所有代码(如果需要改写)
(2)第二步:编写好自己的扇区擦除,扇区读,扇区 写三个函数,函数原型必须符合fat.h中定义的形式
(3)调用FAT_install(),安装该驱动器
(4)如果FAT_install()调用成功则可以使用文件层API操作文件了
(5)退出时必须调用FAT_terminate(),否则会造成内存泄露
在Win32下,偶把一个U盘的内容通过WinHex读成一个文件FAT32.img,实现读写的代码如下:
(1)source\portable.c中的代码不动,Win32直接支持malloc()和free()函数,文件日期固定是2006-1-1,时间固定是00:00:00,这样
每次建立文件和文件夹的日期和时间都是固定的
(2)三个关于扇区的函数是:
(注意,这三个函数必须是执行成功返回1,否则返回0)
BOOL erase(DWORD dwSectors,DWORD dwBytesPerSector,void*user_data)
{
return 1;/*不需要擦除,直接返回1即可*/
}
BOOL read(DWORD dwSectors,void*buff,DWORD dwBytesPerSector,void*user_data)
{
HANDLE hFile=(HANDLE)user_data;/*user_data是文件指针*/
SetFilePointer(hFile,dwSectors*dwBytesPerSector,NULL,FILE_BEGIN);
return ReadFile(hFile,buff,dwBytesPerSector,&dwBytesPerSector,NULL);
}
BOOL write(DWORD dwSectors,void*buff,DWORD dwBytesPerSector,void*user_data)
{
HANDLE hFile=(HANDLE)user_data;
SetFilePointer(hFile,dwSectors*dwBytesPerSector,NULL,FILE_BEGIN);
return WriteFile(hFile,buff,dwBytesPerSector,&dwBytesPerSector,NULL);
}
(3)初始化和使用FAT代码如下:
void main()
{
HANDLE hFile;
FILE*p;
/*先打开fat16.img*/
hFile=CreateFile("C:\\fat16.img",GENERIC_WRITE|GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if(FAT_install(erase,read,write,(void*)hFile))/*如果安装成功*/
{
/*安装成功的情况下,系统会存在"C:"这个逻辑盘*/
p=fopen("C:\\demo.txt","w");/*打开demo.txt写*/
if(p)/*使用前先判断是良好的编程习惯*/
{
fputs("This is a demo program!!",p);/*写入字符串*/
fclose(p);/*必须调用fclose(p),否则可能出现有文件名无内容或者内容不对,同是如果不调用fclose(),也会产生内存泄露*/
}
FAT_terminate();/*最后必须调用此函数释放FAT占用的内存*/
CloseHandle(hFile);/*关闭fat16.img*/
}
}
近期下载者:
相关文件:
收藏者: