標(biāo)題:
CheapFAT--嵌入式文件系統(tǒng)免費(fèi)源碼下載
[打印本頁]
作者:
figureyang
時(shí)間:
2016-10-21 09:37
標(biāo)題:
CheapFAT--嵌入式文件系統(tǒng)免費(fèi)源碼下載
CheapFAT--嵌入式文件系統(tǒng)免費(fèi)源碼下載
CheapFAT版本完全兼容FAT16/FAT32文件系統(tǒng)總共兩種格式,兼容長(zhǎng)文件名,
兼容文字編碼GB2312/UNICODE漢字編碼(文件名完全支持中文),
實(shí)現(xiàn)了支持子目錄,實(shí)現(xiàn)了支持文件的讀取,寫入,刪除,創(chuàng)建等文件系統(tǒng)常用功能。
總之,本文件系統(tǒng)代碼全部使用C代碼編寫,可以移植去各種單片機(jī)平臺(tái)上面實(shí)現(xiàn)文件系統(tǒng)模塊。
本文件系統(tǒng)是精簡(jiǎn)版,適合在嵌入式上使用,相當(dāng)于cheap_flash_fs的精簡(jiǎn)版。
支持多扇區(qū)操作。
(CheapFAT為我們的免費(fèi)代碼,用戶可免費(fèi)測(cè)試,研究,應(yīng)用。并可用于商業(yè)目的!
如果您需要聯(lián)系作者,請(qǐng)通過! qq:292942278,E-MAIL:
292942278@qq.com.cn
取得聯(lián)系)
BUG
1.(2010-06-01)函數(shù)GetEntryFromDirectory(),解決HIDDEN目錄枚舉失敗!
2.(2010-06-05)優(yōu)化FreeClusterChain()!
3.(2010-06-06)Add_A_Directory_Entry_(), seek_space()是長(zhǎng)文件名,len++;
4.(2010-06-13)CORE_offset_add_32(), 解決末簇0xfffffff誤判錯(cuò)誤!
5.Writeback_FCB_file_buffer(u8 FCBsn)-u16 TEMP=>>u32 TEMP
6.解決多個(gè)長(zhǎng)文件名對(duì)應(yīng)短文件名沖突,造成PC藍(lán)屏的問題!
7.(2010-09-12)解決GetEntryWithLongFileName()中文長(zhǎng)文件名尾判斷失誤的BUG,計(jì)算大于0X80的字符為UNICODE,而非ASCII.
8.(2010-09-13)GetEntryFromDirectory()返回的ENTRY NAME包括Extension,Extension不放數(shù)據(jù),廢棄
9.(2011-01-31)GetEntryFromDirectory()增加檢查CORE.offset==512目錄讀取結(jié)束的判斷
10.(2011-02-21)解決中文相對(duì)路徑在FullPathToSectorCluster()中判斷失誤的bug!
11.(2011-05-26)解決FAT32長(zhǎng)文件名不能生成不同短文件的錯(cuò)誤!
12.(2011-05-27)解決長(zhǎng)文件名不帶擴(kuò)展名或擴(kuò)展名大于3個(gè)字符的生成相同短文件名的BUG!
13.(2011-05-27)解決文件名的擴(kuò)展名大于3個(gè)字節(jié),則建立長(zhǎng)文件名!
14.(2011-07-04)解決不能刪除空目錄的BUG,!改進(jìn)了空目錄的判斷!
15.(2011-07-06)解決time驅(qū)動(dòng),秒需要除2!
16.(2011-07-08)增加一個(gè)函數(shù)get_file_attribute(),用于獲取文件或目錄的讀寫時(shí)間
17.(2011-07-08)解決FullPathToSectorCluster目錄和文件不能區(qū)分的BUG!
18.(2011-08-03)解決Get_Previous_Cluster_From_Current_Cluster()不能獲取前一簇的BUG;
19.(2012-06-10)解決UPCASE對(duì)日文處理的BUG和相對(duì)路徑開始不是字符路徑不能轉(zhuǎn)換成功的BUG;
20.(2012-06-16)CurClusterInBUF_for_read,CurClusterInBUF_for_read兩變量的去除;
21.(2012-06-16)優(yōu)化Update_FCB_file_buffer(),加入了判斷文件緩沖是否已緩沖完的判斷!
22.(2014-05-28)取文件ENTRY時(shí)正好遇到末簇,再offset_add_32加個(gè)offset==512的判斷!
0.png
(49.4 KB, 下載次數(shù): 207)
下載附件
2016-10-21 12:54 上傳
CheapFAT.rar
(1.68 MB, 下載次數(shù): 11)
2016-10-21 09:37 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
作者:
admin
時(shí)間:
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"
/*
===============================================================================
函數(shù)
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);
/* 建立一個(gè)目錄CREATE_FOLDER_TEST,以測(cè)試建立目錄函數(shù)create_floder() */
create_folder("c:\\測(cè)試中文目錄");
create_file("測(cè)試中文目錄\\測(cè)試中文文件名.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下建立一個(gè)文件,以測(cè)試建立目錄函數(shù)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"
,以測(cè)試重命名文件函數(shù)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目錄下連續(xù)寫文件,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; //設(shè)置disk_enumeration列舉mode(0)-復(fù)位至第一個(gè)文件項(xiàng)或目錄項(xiàng)開始枚舉
while(disk_enumeration(0,buf,mode,&ATTR) == SUCC) //枚舉一個(gè)目錄項(xiàng)或目錄項(xiàng)
{
printf("\nreaded entry=%s Attr = %x",buf,ATTR); //打印被枚舉的一個(gè)目錄項(xiàng)或目錄項(xiàng)
if(mode == 0)
mode = 1; //設(shè)置disk_enumeration列舉mode(1)- 繼續(xù)上一枚舉后的目錄項(xiàng)或目錄項(xiàng)
if(ATTR & ATTR_DIRECTORY)
{
buf[0]++;
create_folder(buf); //建一個(gè)disk_enumeration的目錄
continue;
}
else //復(fù)制文件
{ HANDLE1 = open_file(buf); //打開文件
buf[0]++;
create_file(buf); //在DISK1上建立文件
}
if(HANDLE1 != FAIL)
{ HANDLE2 = open_file(buf); //打開DISK1上建立的文件
if(HANDLE2 == FAIL)
break;
do{ //復(fù)制文件
cc = read_file(HANDLE1,buf+400,50000); //讀文件
printf("\nreaded chars = %ld ",cc); //打印讀文件讀取的字節(jié)數(shù)
cc = write_file(HANDLE2,buf+400,cc); //將讀取的字節(jié)寫去DISK1上的文件
if(cc != 50000) //檢查讀取的字節(jié)數(shù),確認(rèn)文件尾
{
close_file(HANDLE1); //文件復(fù)制結(jié)束,關(guān)閉文件
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 創(chuàng)建成功!\n");
}
ret = create_file("C:\\newFolder_0\\newFile_1");
if (ret == 0)
{
printf("newFolder_0\\newFile_1 創(chuàng)建成功!\n");
}
ret = create_file("C:\\newFolder_0\\newFile_2");
if (ret == 0)
{
printf("newFolder_0\\newFile_2 創(chuàng)建成功!\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");
//獲取文件的訪問,建立,修改時(shí)間
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");
}
//獲取目錄的訪問,建立,修改時(shí)間
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("-実現(xiàn)不能なことばは始終で美しい-");
create_file("人生で最も意義がある時(shí)間は、苦しんでいる時(shí)間だ。.txt");
ret = create_file("-実現(xiàn)不能なことばは始終で美しい-.txt");
handle = open_file("-実現(xiàn)不能なことばは始終で美しい-.txt");
write_file(handle,buffer,1024);
create_file("Локальный IP адрес.txt");
create_file("Endere?o do IP Local.txt");
close_file(handle);
create_file("FatFsは小規(guī)模な組み込みシステム向けの汎用FATファイルシステム?モジュールです。ANSI C準(zhǔn)拠でハードウェア?アーキテクチャには依存しないので、必要なワーク?エリアが確保できれば、8051,.txt");
create_file("正普個(gè)人-楊文斌.txt");
create_folder("蘇州正普系統(tǒng)軟件有限公司");
create_folder("GetEntryFromDirectory()增加檢查CORE.offset==512目錄讀取結(jié)束的判斷");
create_file("測(cè)試中文文件名.txt");
create_file("蘇州正普系統(tǒng)軟件有限公司.txt");
create_file("GetEntryFromDirectory()增加檢查CORE.offset==512目錄讀取結(jié)束的判斷.txt");
scanf("%c",&ret);
#endif
}
/*
+FFTR--------------------------------------------------------------------
$Log: main.C,v $
-FFTR--------------------------------------------------------------------
*/
復(fù)制代碼
作者:
figureyang
時(shí)間:
2019-12-24 08:13
Cheap_Flash_FS(普通版)(SPI_Flash版)--嵌入式SPI_FLASH文件系統(tǒng)免費(fèi)源碼,請(qǐng)下載
本代碼通過仿真了一個(gè)華邦SPI_FLASH的功能,仿真了一個(gè)SPI_FLASH的4K sector erase和256 bytes page program
和read data(512 byte)的華幫SPI_FLASH(型號(hào)W25Q128BV 16MB)
向上層提供一個(gè)扇區(qū)讀寫的轉(zhuǎn)換驅(qū)動(dòng)接口函數(shù).
支持SPI_FLASH片上預(yù)分配功能(就是擦一次,寫多個(gè)扇區(qū)的功能)加快了FLASH的寫速度,且能降低內(nèi)耗占用量.
其上面可以運(yùn)行FAT文件系統(tǒng)(支持多扇區(qū)操作).
用戶使用本代碼,需要自己在SPI_flash_drv.c寫SPI FLASH的相關(guān)驅(qū)動(dòng),就可以實(shí)現(xiàn)移植,實(shí)現(xiàn)自己所需的扇區(qū)讀寫功能.
本代碼生成的spi_flash.bin是SPI_FLASH的仿真IMG,因?yàn)闆]有壞塊,可直接用WIN IMG打開查看里面的文件.
本代碼可以用在U盤使用SPI_FLASH作存儲(chǔ)的項(xiàng)目上,以及其它SPI_FLASH需要扇區(qū)讀寫功能上.
用戶如果需要技術(shù)支持,請(qǐng)與我們聯(lián)系.
qq:292942278 e-mail:tony_yang123@sina.com.cn
Cheap_Flash_FS(普通版)(SPI_Flash版).rar
(2.68 MB, 下載次數(shù): 5)
2019-12-24 08:13 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1