标题:
CheapFAT--嵌入式文件系统免费源码下载
[打印本页]
作者:
figureyang
时间:
2016-10-21 09:37
标题:
CheapFAT--嵌入式文件系统免费源码下载
CheapFAT--嵌入式文件系统免费源码下载
CheapFAT版本完全兼容FAT16/FAT32文件系统总共两种格式,兼容长文件名,
兼容文字编码GB2312/UNICODE汉字编码(文件名完全支持中文),
实现了支持子目录,实现了支持文件的读取,写入,删除,创建等文件系统常用功能。
总之,本文件系统代码全部使用C代码编写,可以移植去各种单片机平台上面实现文件系统模块。
本文件系统是精简版,适合在嵌入式上使用,相当于cheap_flash_fs的精简版。
支持多扇区操作。
(CheapFAT为我们的免费代码,用户可免费测试,研究,应用。并可用于商业目的!
如果您需要联系作者,请通过! qq:292942278,E-MAIL:
292942278@qq.com.cn
取得联系)
BUG
1.(2010-06-01)函数GetEntryFromDirectory(),解决HIDDEN目录枚举失败!
2.(2010-06-05)优化FreeClusterChain()!
3.(2010-06-06)Add_A_Directory_Entry_(), seek_space()是长文件名,len++;
4.(2010-06-13)CORE_offset_add_32(), 解决末簇0xfffffff误判错误!
5.Writeback_FCB_file_buffer(u8 FCBsn)-u16 TEMP=>>u32 TEMP
6.解决多个长文件名对应短文件名冲突,造成PC蓝屏的问题!
7.(2010-09-12)解决GetEntryWithLongFileName()中文长文件名尾判断失误的BUG,计算大于0X80的字符为UNICODE,而非ASCII.
8.(2010-09-13)GetEntryFromDirectory()返回的ENTRY NAME包括Extension,Extension不放数据,废弃
9.(2011-01-31)GetEntryFromDirectory()增加检查CORE.offset==512目录读取结束的判断
10.(2011-02-21)解决中文相对路径在FullPathToSectorCluster()中判断失误的bug!
11.(2011-05-26)解决FAT32长文件名不能生成不同短文件的错误!
12.(2011-05-27)解决长文件名不带扩展名或扩展名大于3个字符的生成相同短文件名的BUG!
13.(2011-05-27)解决文件名的扩展名大于3个字节,则建立长文件名!
14.(2011-07-04)解决不能删除空目录的BUG,!改进了空目录的判断!
15.(2011-07-06)解决time驱动,秒需要除2!
16.(2011-07-08)增加一个函数get_file_attribute(),用于获取文件或目录的读写时间
17.(2011-07-08)解决FullPathToSectorCluster目录和文件不能区分的BUG!
18.(2011-08-03)解决Get_Previous_Cluster_From_Current_Cluster()不能获取前一簇的BUG;
19.(2012-06-10)解决UPCASE对日文处理的BUG和相对路径开始不是字符路径不能转换成功的BUG;
20.(2012-06-16)CurClusterInBUF_for_read,CurClusterInBUF_for_read两变量的去除;
21.(2012-06-16)优化Update_FCB_file_buffer(),加入了判断文件缓冲是否已缓冲完的判断!
22.(2014-05-28)取文件ENTRY时正好遇到末簇,再offset_add_32加个offset==512的判断!
0.png
(49.4 KB, 下载次数: 207)
下载附件
2016-10-21 12:54 上传
CheapFAT.rar
(1.68 MB, 下载次数: 11)
2016-10-21 09:37 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
admin
时间:
2016-10-21 13:00
部分源码:
/*
+FHDR------------------------------------------------------------------
Copyright (c),
Tony Yang –specialized in fat usb firmware development
Contact:qq 292942278 e-mail:tony_yang123@sina.com.cn
;;;;;;;;;;
Abstract:
$Id: main.C,v 1.12 2007/05/10 11:13:14 design Exp $
-FHDR-------------------------------------------------------------------
*/
#include "stdio.h"
#include "include\types.h"
#include "fat\fat.h"
#include "Flash_Management\Flash_Management.h"
#include "include\FAT_cfg.h"
/*
===============================================================================
函数
main();
入口:无
出口:无
===============================================================================
*/
static FILE *file2;
static u8 Fl;
void main(void)
{
#if 1
u32 cc,bb;
u16 COUNT,i;
u8 a,ATTR,j,b,mode;
u8 HANDLE1,HANDLE2;
u8 buf[65536];
u8 ddd[] = "c:\\ok\\aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa我们aaaaaaaaaaaAAAAAAAAAAAaaaaaaaaa.rar";
flash_management_sysinit();
FAT_filesystem_autoformat('C',FAT32,270336*2*2);
FAT_filesystem_autoformat('D',FAT16,270336);
FAT_filesystem_initialization();
volume_inquiry('c',&cc,&bb);
printf("Volume C Capacity: %ld\n",cc);
printf("Volume C FreeSpace: %ld\n",bb);
volume_inquiry('d',&cc,&bb);
printf("Volume D Capacity: %ld\n",cc);
printf("Volume D FreeSpace: %ld\n",bb);
scanf("%c",&a);
/* 建立一个目录CREATE_FOLDER_TEST,以测试建立目录函数create_floder() */
create_folder("c:\\测试中文目录");
create_file("测试中文目录\\测试中文文件名.txt");
create_folder("aaaaaaaaaaA");
create_folder("aaaaaaaaaaA");
create_folder("C:\\AAAAAAAAAAAaaaaaa");
create_folder("D:\\AAAAAAAAAAAaaaaaa");
create_folder("c:\\CREATE_FOLDER_TEST");
create_folder("D:\\CREATE_FOLDER_TEST");
scanf("%c",&a);
/* 在目录CREATE_FOLDER_TEST下建立一个文件,以测试建立目录函数create_file() */
create_file("C:\\CREATE_FOLDER_TEST\\created_file.txt");
create_file("D:\\CREATE_FOLDER_TEST\\created_file.txt");
create_file("C:\\CREATE_FOLDER_TEST\\AAAAAAAAAAB");
create_file("D:\\CREATE_FOLDER_TEST\\AAAAAAAAAABaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
create_file("D:\\CREATE_FOLDER_TEST\\aa.rarc.rar.rar");
/* 重命令文件CREATE_FOLDER_TEST\\created_file.txt为"DFDFDFDFDFDFDFDFSDFSDTONY.TXT"
,以测试重命名文件函数rename_file() */
//rename_file("ok\\bAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.RAR","DFDFDFDFDFDFDFDFSDFSDTONY.TXT");
//scanf("%c",&a);
/* 删除文件CREATE_FOLDER_TEST\\created_file.txt */
//delete_file("ok\\ZZZZZZZZZZZZZZZUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.RAR");
/* 删除目录CREATE_FOLDER_TEST */
//delete_folder("CREATE_FOLDER_TEST");
/* 列举CREATE_FOLDER_TEST目录下面的所有文件,打印到屏幕 */
cd_folder("c:\\CREATE_FOLDER_TEST",0);
a = 0;
while(folder_enumeration(buf,a,&ATTR) == SUCC)
{
printf("\nreaded entry=%s Attr = %x",buf,ATTR);
if(a == 0)
a = 1;
}
scanf("%c",&a);
cd_folder(" ",1);
/* 列举根目录的文件,打印去屏幕 */
a = 0;
while(folder_enumeration(buf,a,&ATTR) == SUCC)
{
printf("\nreaded entry=%s Attr = %x",buf,ATTR);
if(a == 0)
a = 1;
}
scanf("%c",&a);
#if 1
/* 在OK目录下连续写文件,readed.rar,直到磁盘被写满 */
create_folder("c:\\ok");
j = 0;
COUNT = 0;
do{
for(a = 0;a < 25; a++)
{
COUNT++;
if(create_file(ddd) == SUCC)
{
printf("Create file %s successfully\n",ddd);
HANDLE1 = open_file(ddd);
if((file2 = fopen("readed.rar","rb+")) == NULL)
{
return;
}
if(HANDLE1 != FAIL)
{
printf("\nOpen File %s successfully",ddd);
do{
cc = fread(buf,1,40000,file2);
//printf("\nreaded chars = %ld ",cc);
write_file(HANDLE1,buf, cc);
if(cc < 40000)
break;
}while(1);
close_file(HANDLE1);
fclose(file2);
}
else
printf("\nOpen File %s failed",ddd);
}
else
printf("Create file %s failed\n",ddd);
ddd[6+j] ++;
}
j++;
}while(j< 20);
scanf("%c",&a);
/* 分离磁盘0中的所有文件 */
a = 0;
while(disk_enumeration(0,buf,a,&ATTR) == SUCC)
{
printf("\nreaded entry=%s Attr = %x",buf,ATTR);
if(a == 0)
a = 1;
if(ATTR & ATTR_DIRECTORY)
{
mkdir(buf+3);
continue;
}
else
{
if ((file2 = fopen(buf+3,"wb+")) == NULL)
{ printf("create file failed");scanf("%c",buf);
return;
}
else
HANDLE1 = open_file(buf);
}
if(HANDLE1 != FAIL)
do{
cc = read_file(HANDLE1,buf+400,50000);
printf("\nreaded chars = %ld ",cc);
fwrite(buf+400,1,cc,file2);
if(cc != 50000)
{
close_file(HANDLE1);
break;
}
}while(1);
else{
printf("Openfile failed!");
}
fclose(file2);
}
scanf("%c",&a);
#endif
/* DISK0 拷贝至DISK1 */
mode = 0; //设置disk_enumeration列举mode(0)-复位至第一个文件项或目录项开始枚举
while(disk_enumeration(0,buf,mode,&ATTR) == SUCC) //枚举一个目录项或目录项
{
printf("\nreaded entry=%s Attr = %x",buf,ATTR); //打印被枚举的一个目录项或目录项
if(mode == 0)
mode = 1; //设置disk_enumeration列举mode(1)- 继续上一枚举后的目录项或目录项
if(ATTR & ATTR_DIRECTORY)
{
buf[0]++;
create_folder(buf); //建一个disk_enumeration的目录
continue;
}
else //复制文件
{ HANDLE1 = open_file(buf); //打开文件
buf[0]++;
create_file(buf); //在DISK1上建立文件
}
if(HANDLE1 != FAIL)
{ HANDLE2 = open_file(buf); //打开DISK1上建立的文件
if(HANDLE2 == FAIL)
break;
do{ //复制文件
cc = read_file(HANDLE1,buf+400,50000); //读文件
printf("\nreaded chars = %ld ",cc); //打印读文件读取的字节数
cc = write_file(HANDLE2,buf+400,cc); //将读取的字节写去DISK1上的文件
if(cc != 50000) //检查读取的字节数,确认文件尾
{
close_file(HANDLE1); //文件复制结束,关闭文件
close_file(HANDLE2);
break;
}
}while(1);
}
else
{
printf("Openfile failed!");
}
}
scanf("%c",&a);
#else
u8 ret;
u8 handle,buffer[65536];
struct attribute ATTRIBUTE;
ret = flash_management_sysinit();
ret = FAT_filesystem_autoformat('C',FAT32,270336*2*2);
ret = FAT_filesystem_initialization();
ret = create_folder("C:\\newFolder_0");
if (ret == 0)
{
printf("newFolder_0 创建成功!\n");
}
ret = create_file("C:\\newFolder_0\\newFile_1");
if (ret == 0)
{
printf("newFolder_0\\newFile_1 创建成功!\n");
}
ret = create_file("C:\\newFolder_0\\newFile_2");
if (ret == 0)
{
printf("newFolder_0\\newFile_2 创建成功!\n");
}
ret = delete_file("C:\\newFolder_0\\newFile_1");
if (ret == 0)
{
printf("newFolder_0\\newFile_1 删除成功!\n");
}
ret = delete_file("C:\\newFolder_0\\newFile_2");
if (ret == 0)
{
printf("newFolder_0\\newFile_2 删除成功!\n");
}
cd_folder("C:\\newFolder_0",1);
ret = delete_folder("C:\\newFolder_0");//成功
if (ret == 0)
{
printf("newFolder_0 删除成功!\n\n");
}
else
printf("newFolder_0 删除失败!\n\n");
//获取文件的访问,建立,修改时间
create_file("test.txt");
if(get_file_attribute("test.txt", The_FILE, &ATTRIBUTE)== SUCC)
{
printf("\n文件:test.txt\naccess time: %d-%d-%d",ATTRIBUTE.access_time_year,ATTRIBUTE.access_time_month,ATTRIBUTE.access_time_day);
printf("\ncreate time: %d-%d-%d",ATTRIBUTE.create_time_year,ATTRIBUTE.create_time_month,ATTRIBUTE.create_time_day);
printf("\ncreate time: %d:%d:%d",ATTRIBUTE.create_time_hour,ATTRIBUTE.create_time_minute,ATTRIBUTE.create_time_second);
printf("\nmodify time: %d-%d-%d",ATTRIBUTE.modify_time_year,ATTRIBUTE.modify_time_month,ATTRIBUTE.modify_time_day);
printf("\nmodify time: %d:%d:%d",ATTRIBUTE.modify_time_hour,ATTRIBUTE.modify_time_minute,ATTRIBUTE.modify_time_second);
printf("\nattr=%x",ATTRIBUTE.attr);
}
else
{
printf("FAIL");
}
//获取目录的访问,建立,修改时间
create_folder("test");
if(get_file_attribute("test", The_DIRECTORY, &ATTRIBUTE)== SUCC)
{
printf("\n目录:test\naccess time: %d-%d-%d",ATTRIBUTE.access_time_year,ATTRIBUTE.access_time_month,ATTRIBUTE.access_time_day);
printf("\ncreate time: %d-%d-%d",ATTRIBUTE.create_time_year,ATTRIBUTE.create_time_month,ATTRIBUTE.create_time_day);
printf("\ncreate time: %d:%d:%d",ATTRIBUTE.create_time_hour,ATTRIBUTE.create_time_minute,ATTRIBUTE.create_time_second);
printf("\nmodify time: %d-%d-%d",ATTRIBUTE.modify_time_year,ATTRIBUTE.modify_time_month,ATTRIBUTE.modify_time_day);
printf("\nmodify time: %d:%d:%d",ATTRIBUTE.modify_time_hour,ATTRIBUTE.modify_time_minute,ATTRIBUTE.modify_time_second);
printf("\nattr=%x",ATTRIBUTE.attr);
}
else
{
printf("FAIL");
}
create_folder("-実現不能なことばは始終で美しい-");
create_file("人生で最も意義がある時間は、苦しんでいる時間だ。.txt");
ret = create_file("-実現不能なことばは始終で美しい-.txt");
handle = open_file("-実現不能なことばは始終で美しい-.txt");
write_file(handle,buffer,1024);
create_file("Локальный IP адрес.txt");
create_file("Endere?o do IP Local.txt");
close_file(handle);
create_file("FatFsは小規模な組み込みシステム向けの汎用FATファイルシステム?モジュールです。ANSI C準拠でハードウェア?アーキテクチャには依存しないので、必要なワーク?エリアが確保できれば、8051,.txt");
create_file("正普個人-楊文斌.txt");
create_folder("苏州正普系统软件有限公司");
create_folder("GetEntryFromDirectory()增加检查CORE.offset==512目录读取结束的判断");
create_file("测试中文文件名.txt");
create_file("苏州正普系统软件有限公司.txt");
create_file("GetEntryFromDirectory()增加检查CORE.offset==512目录读取结束的判断.txt");
scanf("%c",&ret);
#endif
}
/*
+FFTR--------------------------------------------------------------------
$Log: main.C,v $
-FFTR--------------------------------------------------------------------
*/
复制代码
作者:
figureyang
时间:
2019-12-24 08:13
Cheap_Flash_FS(普通版)(SPI_Flash版)--嵌入式SPI_FLASH文件系统免费源码,请下载
本代码通过仿真了一个华邦SPI_FLASH的功能,仿真了一个SPI_FLASH的4K sector erase和256 bytes page program
和read data(512 byte)的华帮SPI_FLASH(型号W25Q128BV 16MB)
向上层提供一个扇区读写的转换驱动接口函数.
支持SPI_FLASH片上预分配功能(就是擦一次,写多个扇区的功能)加快了FLASH的写速度,且能降低内耗占用量.
其上面可以运行FAT文件系统(支持多扇区操作).
用户使用本代码,需要自己在SPI_flash_drv.c写SPI FLASH的相关驱动,就可以实现移植,实现自己所需的扇区读写功能.
本代码生成的spi_flash.bin是SPI_FLASH的仿真IMG,因为没有坏块,可直接用WIN IMG打开查看里面的文件.
本代码可以用在U盘使用SPI_FLASH作存储的项目上,以及其它SPI_FLASH需要扇区读写功能上.
用户如果需要技术支持,请与我们联系.
qq:292942278 e-mail:tony_yang123@sina.com.cn
Cheap_Flash_FS(普通版)(SPI_Flash版).rar
(2.68 MB, 下载次数: 5)
2019-12-24 08:13 上传
点击文件名下载附件
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1