找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4364|回复: 2
打印 上一主题 下一主题
收起左侧

CheapFAT--嵌入式文件系统免费源码下载

[复制链接]
跳转到指定楼层
楼主
ID:49552 发表于 2016-10-21 09:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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的判断!


CheapFAT.rar (1.68 MB, 下载次数: 11)




分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1 发表于 2016-10-21 13:00 | 只看该作者
部分源码:
  1. /*
  2. +FHDR------------------------------------------------------------------
  3. Copyright (c),
  4. Tony Yang –specialized in fat usb firmware development  
  5. Contact:qq 292942278  e-mail:tony_yang123@sina.com.cn
  6. ;;;;;;;;;;
  7. Abstract:
  8. $Id: main.C,v 1.12 2007/05/10 11:13:14 design Exp $
  9. -FHDR-------------------------------------------------------------------
  10. */
  11. #include "stdio.h"
  12. #include "include\types.h"
  13. #include "fat\fat.h"
  14. #include "Flash_Management\Flash_Management.h"
  15. #include "include\FAT_cfg.h"

  16. /*
  17. ===============================================================================
  18. 函数
  19. main();
  20. 入口:无
  21. 出口:无
  22. ===============================================================================
  23. */
  24. static FILE *file2;
  25. static u8 Fl;
  26. void main(void)
  27. {


  28. #if 1

  29.   u32 cc,bb;
  30.   u16 COUNT,i;  
  31.   u8 a,ATTR,j,b,mode;
  32.   u8 HANDLE1,HANDLE2;   
  33.   u8 buf[65536];  
  34.   u8 ddd[] = "c:\\ok\\aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa我们aaaaaaaaaaaAAAAAAAAAAAaaaaaaaaa.rar";
  35.   flash_management_sysinit();

  36.   FAT_filesystem_autoformat('C',FAT32,270336*2*2);
  37.   FAT_filesystem_autoformat('D',FAT16,270336);
  38.   FAT_filesystem_initialization();
  39.   volume_inquiry('c',&cc,&bb);  

  40.   printf("Volume C Capacity: %ld\n",cc);
  41.   printf("Volume C FreeSpace: %ld\n",bb);
  42.   volume_inquiry('d',&cc,&bb);

  43.   printf("Volume D Capacity: %ld\n",cc);
  44.   printf("Volume D FreeSpace: %ld\n",bb);
  45.   scanf("%c",&a);  


  46. /*  建立一个目录CREATE_FOLDER_TEST,以测试建立目录函数create_floder()  */
  47.   create_folder("c:\\测试中文目录");
  48.   create_file("测试中文目录\\测试中文文件名.txt");
  49.   create_folder("aaaaaaaaaaA");
  50.   create_folder("aaaaaaaaaaA");
  51.   create_folder("C:\\AAAAAAAAAAAaaaaaa");
  52.   create_folder("D:\\AAAAAAAAAAAaaaaaa");
  53.   create_folder("c:\\CREATE_FOLDER_TEST");
  54.   create_folder("D:\\CREATE_FOLDER_TEST");

  55.   scanf("%c",&a);

  56. /*  在目录CREATE_FOLDER_TEST下建立一个文件,以测试建立目录函数create_file()  */
  57. create_file("C:\\CREATE_FOLDER_TEST\\created_file.txt");
  58. create_file("D:\\CREATE_FOLDER_TEST\\created_file.txt");
  59. create_file("C:\\CREATE_FOLDER_TEST\\AAAAAAAAAAB");
  60. create_file("D:\\CREATE_FOLDER_TEST\\AAAAAAAAAABaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
  61. create_file("D:\\CREATE_FOLDER_TEST\\aa.rarc.rar.rar");
  62. /* 重命令文件CREATE_FOLDER_TEST\\created_file.txt为"DFDFDFDFDFDFDFDFSDFSDTONY.TXT"
  63.    ,以测试重命名文件函数rename_file() */

  64. //rename_file("ok\\bAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.RAR","DFDFDFDFDFDFDFDFSDFSDTONY.TXT");
  65. //scanf("%c",&a);       
  66. /* 删除文件CREATE_FOLDER_TEST\\created_file.txt */
  67.   //delete_file("ok\\ZZZZZZZZZZZZZZZUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.RAR");

  68. /* 删除目录CREATE_FOLDER_TEST */
  69.   //delete_folder("CREATE_FOLDER_TEST");

  70. /*  列举CREATE_FOLDER_TEST目录下面的所有文件,打印到屏幕  */
  71.   cd_folder("c:\\CREATE_FOLDER_TEST",0);

  72.    a = 0;
  73.   while(folder_enumeration(buf,a,&ATTR) == SUCC)
  74.   {
  75.      printf("\nreaded entry=%s Attr = %x",buf,ATTR);

  76.      if(a == 0)
  77.            a = 1;
  78.   }
  79. scanf("%c",&a);       

  80. cd_folder(" ",1);

  81. /*  列举根目录的文件,打印去屏幕  */

  82.    a = 0;
  83.   while(folder_enumeration(buf,a,&ATTR) == SUCC)
  84.   {
  85.      printf("\nreaded entry=%s Attr = %x",buf,ATTR);

  86.      if(a == 0)
  87.            a = 1;
  88.   }
  89. scanf("%c",&a);       

  90. #if 1
  91. /* 在OK目录下连续写文件,readed.rar,直到磁盘被写满 */
  92.    create_folder("c:\\ok");
  93. j = 0;
  94. COUNT = 0;
  95. do{
  96. for(a = 0;a < 25; a++)
  97. {
  98.   COUNT++;         
  99. if(create_file(ddd) == SUCC)
  100. {
  101.    printf("Create file %s successfully\n",ddd);
  102.   
  103.    HANDLE1 = open_file(ddd);
  104.    if((file2 = fopen("readed.rar","rb+")) == NULL)
  105.      {
  106.       return;
  107.      }
  108.         if(HANDLE1 != FAIL)
  109.         {   
  110.                   
  111.                 printf("\nOpen File %s successfully",ddd);
  112.                 do{
  113.        
  114.         cc = fread(buf,1,40000,file2);
  115.                 //printf("\nreaded chars = %ld ",cc);
  116.             write_file(HANDLE1,buf, cc);
  117.                 if(cc < 40000)
  118.                         break;
  119.                 }while(1);
  120.                 close_file(HANDLE1);
  121.                 fclose(file2);
  122.         }
  123.         else
  124.        printf("\nOpen File %s failed",ddd);

  125. }
  126. else
  127.    printf("Create file %s failed\n",ddd);
  128.   ddd[6+j] ++;
  129. }
  130.   j++;
  131. }while(j< 20);

  132. scanf("%c",&a);       

  133. /*  分离磁盘0中的所有文件  */
  134.   a = 0;
  135.   while(disk_enumeration(0,buf,a,&ATTR) == SUCC)
  136.   {
  137.      printf("\nreaded entry=%s Attr = %x",buf,ATTR);
  138.          
  139.      if(a == 0)
  140.            a = 1;


  141.          if(ATTR & ATTR_DIRECTORY)
  142.          {
  143.            mkdir(buf+3);
  144.            continue;
  145.          }
  146.          else
  147.      {
  148.                  if ((file2 = fopen(buf+3,"wb+")) == NULL)
  149.                  { printf("create file failed");scanf("%c",buf);
  150.            return;

  151.                  }   
  152.              else
  153.                    HANDLE1 = open_file(buf);
  154.          }
  155.          
  156.         if(HANDLE1 != FAIL)
  157.                 do{             
  158.             cc = read_file(HANDLE1,buf+400,50000);
  159.                 printf("\nreaded chars = %ld ",cc);
  160.         fwrite(buf+400,1,cc,file2);
  161.                 if(cc != 50000)
  162.                 {
  163.                         close_file(HANDLE1);

  164.                        
  165.                 break;   
  166.                 }   
  167.        
  168.         }while(1);
  169.     else{
  170.         printf("Openfile failed!");
  171.         }
  172.     fclose(file2);         
  173.   }


  174. scanf("%c",&a);       
  175. #endif

  176. /* DISK0  拷贝至DISK1 */
  177.   mode = 0;      //设置disk_enumeration列举mode(0)-复位至第一个文件项或目录项开始枚举
  178.   while(disk_enumeration(0,buf,mode,&ATTR) == SUCC)          //枚举一个目录项或目录项
  179.   {
  180.      printf("\nreaded entry=%s Attr = %x",buf,ATTR); //打印被枚举的一个目录项或目录项
  181.        
  182.      if(mode == 0)
  183.            mode = 1;    //设置disk_enumeration列举mode(1)- 继续上一枚举后的目录项或目录项
  184.          if(ATTR & ATTR_DIRECTORY)
  185.          {
  186.            buf[0]++;
  187.            create_folder(buf);                              //建一个disk_enumeration的目录
  188.            continue;
  189.          }
  190.          else                                                                   //复制文件
  191.      { HANDLE1 = open_file(buf);                                            //打开文件
  192.            buf[0]++;
  193.            create_file(buf);                                  //在DISK1上建立文件
  194.                
  195.          }
  196.         if(HANDLE1 != FAIL)
  197.         { HANDLE2 = open_file(buf);                                //打开DISK1上建立的文件
  198.           if(HANDLE2 == FAIL)
  199.                   break;
  200.         do{                                                                     //复制文件
  201.             cc = read_file(HANDLE1,buf+400,50000);                                //读文件
  202.                 printf("\nreaded chars = %ld ",cc);                   //打印读文件读取的字节数
  203.         cc = write_file(HANDLE2,buf+400,cc);                //将读取的字节写去DISK1上的文件
  204.                 if(cc != 50000)                                 //检查读取的字节数,确认文件尾
  205.                 {
  206.                  close_file(HANDLE1);                                 //文件复制结束,关闭文件
  207.                  close_file(HANDLE2);
  208.                   break;   
  209.                 }
  210.           }while(1);
  211.         }
  212.     else
  213.         {
  214.           printf("Openfile failed!");
  215.         }
  216.   }



  217. scanf("%c",&a);               



  218. #else
  219.         u8 ret;
  220.         u8 handle,buffer[65536];
  221.     struct attribute ATTRIBUTE;

  222.         ret = flash_management_sysinit();

  223.         ret = FAT_filesystem_autoformat('C',FAT32,270336*2*2);

  224.         ret = FAT_filesystem_initialization();


  225.         ret = create_folder("C:\\newFolder_0");
  226.         if (ret == 0)
  227.         {
  228.                 printf("newFolder_0 创建成功!\n");
  229.         }
  230.        
  231.         ret = create_file("C:\\newFolder_0\\newFile_1");
  232.         if (ret == 0)
  233.         {
  234.                 printf("newFolder_0\\newFile_1 创建成功!\n");
  235.         }
  236.         ret = create_file("C:\\newFolder_0\\newFile_2");
  237.         if (ret == 0)
  238.         {
  239.                 printf("newFolder_0\\newFile_2 创建成功!\n");
  240.         }
  241.                
  242.         ret = delete_file("C:\\newFolder_0\\newFile_1");
  243.         if (ret == 0)
  244.         {
  245.                 printf("newFolder_0\\newFile_1 删除成功!\n");
  246.         }
  247.         ret = delete_file("C:\\newFolder_0\\newFile_2");
  248.         if (ret == 0)
  249.         {
  250.                 printf("newFolder_0\\newFile_2 删除成功!\n");
  251.         }
  252.         cd_folder("C:\\newFolder_0",1);       

  253.         ret = delete_folder("C:\\newFolder_0");//成功
  254.         if (ret == 0)
  255.         {
  256.                 printf("newFolder_0 删除成功!\n\n");
  257.         }
  258.         else
  259.                 printf("newFolder_0 删除失败!\n\n");


  260.   //获取文件的访问,建立,修改时间       
  261.   create_file("test.txt");
  262.   if(get_file_attribute("test.txt", The_FILE, &ATTRIBUTE)== SUCC)                                                                                                                                
  263.   {
  264.         printf("\n文件:test.txt\naccess time: %d-%d-%d",ATTRIBUTE.access_time_year,ATTRIBUTE.access_time_month,ATTRIBUTE.access_time_day);
  265.     printf("\ncreate time: %d-%d-%d",ATTRIBUTE.create_time_year,ATTRIBUTE.create_time_month,ATTRIBUTE.create_time_day);
  266.     printf("\ncreate time: %d:%d:%d",ATTRIBUTE.create_time_hour,ATTRIBUTE.create_time_minute,ATTRIBUTE.create_time_second);
  267.     printf("\nmodify time: %d-%d-%d",ATTRIBUTE.modify_time_year,ATTRIBUTE.modify_time_month,ATTRIBUTE.modify_time_day);
  268.     printf("\nmodify time: %d:%d:%d",ATTRIBUTE.modify_time_hour,ATTRIBUTE.modify_time_minute,ATTRIBUTE.modify_time_second);
  269.     printf("\nattr=%x",ATTRIBUTE.attr);   
  270.   }
  271.   else
  272.   {
  273.     printf("FAIL");
  274.   }

  275.    //获取目录的访问,建立,修改时间
  276.   create_folder("test");
  277.   if(get_file_attribute("test", The_DIRECTORY, &ATTRIBUTE)== SUCC)                                                                                                                                
  278.   {
  279.         printf("\n目录:test\naccess time: %d-%d-%d",ATTRIBUTE.access_time_year,ATTRIBUTE.access_time_month,ATTRIBUTE.access_time_day);
  280.     printf("\ncreate time: %d-%d-%d",ATTRIBUTE.create_time_year,ATTRIBUTE.create_time_month,ATTRIBUTE.create_time_day);
  281.     printf("\ncreate time: %d:%d:%d",ATTRIBUTE.create_time_hour,ATTRIBUTE.create_time_minute,ATTRIBUTE.create_time_second);
  282.     printf("\nmodify time: %d-%d-%d",ATTRIBUTE.modify_time_year,ATTRIBUTE.modify_time_month,ATTRIBUTE.modify_time_day);
  283.     printf("\nmodify time: %d:%d:%d",ATTRIBUTE.modify_time_hour,ATTRIBUTE.modify_time_minute,ATTRIBUTE.modify_time_second);
  284.     printf("\nattr=%x",ATTRIBUTE.attr);   
  285.   }
  286.   else
  287.   {
  288.     printf("FAIL");
  289.   }
  290.   create_folder("-実現不能なことばは始終で美しい-");
  291.   create_file("人生で最も意義がある時間は、苦しんでいる時間だ。.txt");
  292.   ret = create_file("-実現不能なことばは始終で美しい-.txt");
  293.   handle = open_file("-実現不能なことばは始終で美しい-.txt");
  294.   write_file(handle,buffer,1024);
  295.   create_file("Локальный IP адрес.txt");
  296.   create_file("Endere?o do IP Local.txt");
  297.   close_file(handle);
  298.    create_file("FatFsは小規模な組み込みシステム向けの汎用FATファイルシステム?モジュールです。ANSI C準拠でハードウェア?アーキテクチャには依存しないので、必要なワーク?エリアが確保できれば、8051,.txt");
  299.   create_file("正普個人-楊文斌.txt");
  300.   create_folder("苏州正普系统软件有限公司");
  301. create_folder("GetEntryFromDirectory()增加检查CORE.offset==512目录读取结束的判断");
  302.   create_file("测试中文文件名.txt");
  303.   create_file("苏州正普系统软件有限公司.txt");
  304.   create_file("GetEntryFromDirectory()增加检查CORE.offset==512目录读取结束的判断.txt");
  305.         scanf("%c",&ret);
  306. #endif
  307. }
  308.    
  309. /*
  310. +FFTR--------------------------------------------------------------------
  311. $Log: main.C,v $

  312. -FFTR--------------------------------------------------------------------
  313. */

复制代码
回复

使用道具 举报

板凳
ID:49552 发表于 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)






回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表