• c盘转成fat32格式 > 嵌入式FAT16/32文件系统
  • 嵌入式FAT16/32文件系统

    免费下载 下载该文档 文档格式:DOC   更新时间:2014-08-14   下载次数:0   点击次数:1
    嵌入式FAT16/32文件系统 总则 该文件系统是由本人个人开发的,全部代码在VC下编写,测试.VC下测试基于虚拟磁盘驱动(在Flash_management.c)实现对磁盘的读写.实现的文件系统兼容FAT16/FAT32文件系统格式,兼容长文件名,并且实现了对子目录的支持,实现了文件的读取,写入,创建,删除等文件系统的常用功能.另个,代码都使用C编写,可以移植到单片机上运行. 版本说明 以下是文件系统的各个版本,供客户以实际需要选择合适的版本: 免费版本-----只支持一个盘和FAT16 版本1(收费)----只支持一个盘,和FAT16/FAT32 版本2(收费)----支持多个盘,和FAT16/FAT32 文件系统字符串规则 盘符规则 盘符规则,盘符的命名从C开始到Z结束 文件名规则(长文件名不超过255字节) 文件名是由文件名和扩展名组成, 1)短文件名不超过8个字节,长文件名不超过255字节 2)扩展名一般为3个字节 文件名为英文字母、数字和下划线的组合 文件名首字符不能为数字 文件名字符不区分大小写 文件系统的功能列举 该文件系统实现了兼容FAT16/FAT32,兼容长文件名,并且实现了对子目录的支持,实现了文件的读取,写入,创建,删除等文件系统的常用功能. 代码都使用C编写,可以移植到单片机上运行.在单片机上运行程序员需要把虚拟磁盘驱动替换为SD卡或磁盘驱动. 实现了文件读写的缓冲内存:文件缓冲内存越大,读写文件越快,其大小可以编译宏EnableFileBuf,TotalFileBUFsQTYeachFCB,FileBUFSize来设置(fat_cfg.h). 程序源文件说明 fat.c—文件系统的源代码 fat.h—文件系统API函数的declare文件 Fat_cfg.h—文件系统配置文件 Types.h—文件系统的数据类型替换定义 Flash_management.c—虚拟磁盘的驱动 Time.c—RTC时钟驱动,提供文件的存储,创建,修改时间 文件API函数 自动格式化FAT16函数FAT16_filesystem_autoformat()—该函数在U盘启动时运行,它首先会读取Flash 0扇区的MBR,判断MBR有效标记0x55aa,如果MBR有效标记不是0x55aa,该函数将把Flash自动格式化成FAT16文件系统;起用自动格式化处理,Flash上原有的数据将被迫丢失,因此从安全的角度考虑,建议慎用本函数. FAT文件系统初始化函数char FAT_filesystem_initialiation()—该函数是在U盘启动时调用,它将Flash中默认的第一个分区的信息读入struct partition_BPB中,和初始化struct CORE. 文件建立函数u8 create_file(u8 * filename)—该函数用于在文件系统中建立一个文件,文件名及其路径通过形参char *filename来指定; 目录建立函数u8 create_floder(u8 * foldername)—该函数用于在文件系统建立一个目录,目录名通过形参char *foldername来指定; 文件重命名函数u8 rename_file(u8 * oldfilename,u8 * newfilename)—该函数用于对文件系统中的一个文件重命名,原文件名由参数u8 * oldfilename来指定,新文件名由参数u8 * newfilename来指定; 文件打开函数u8 open_file(u8 * filename)—该函数用于在文件系统中的打开一个文件,文件名通过参数u8 * filename来指定,如果打开文件成功,返回值为当前文件操作句柄FCBsn(FCB sequential number),或0xff—文件打开错误,在错误打开的情况下,建议先使用close_file关闭一个打开的文件后再打开文件. 文件关闭函数u8 close_file(u8 FCBsn)—该函数调用关闭一个已打开的文件,并释放当前文件占用的文件操作句柄,文件操作句柄由FCBsn指定. 当前目录改变函数u8 cd_folder(u8 * foldername,u8 mode)—该函数用于改变文件系统的当前目录,改变至目录由参数u8 * foldername来指定.函数有两种的操作模式分别为:1)参数mode= 0:为进入目录;2)参考mode=1为返回上层目录. 文件读写位置设定函数u8 f_seek(u8 FCBsn, s32 offset, u8 origin)—该函数用于文件读写当前位置的设定;FCBsn –是已打开文件的文件柄;offset--相对origin位置偏移量;origin 指定位置移动的参考,其起始参考位置共有三个: SEEK_SET(0) 文件的开始位置 SEEK_CUR(1) 文件的当前位置SEEK_END(2) 文件的结束位置. 文件读函数u16 read_file(u8 FCBsn,8* buffer, u16 length)—该函数完成已打开文件的当前位置读取指定的长度数据,读取的数据存放在缓冲区buffer中,而读取数据的长度是由参数u16 length来指定,缓冲区的首地址由参数u8 * buffer来指定,该函数返回为成功读取的字节数; 文件写函数u16 write_file(u8 FCBsn,u8* buffer, u16 length)- 该函数实现将缓冲区buffer中指定长度的数据写入一个已打开文件的当前位置,,写数据长度由参数u16 length指定,缓冲区首地址由参数char* buffer指定,该函数的返回值为成功写入的字节数; 遍历目录函数u8 folder_enumeration(u8 *return_string,u8 mode,u8 *ATTR)—该函数用于遍历当前目录下所有的文件项和目录项,调用一次将返回一个文件项或目录项,同时定义有二种遍历模式,mode(0)-调用后将复位到目录的第一个文件项或目录项重新开始,mode(1)-继续上一遍历后的目录项,遍历模式由参数char mode传递,遍历返回的文件项或目录名存储于缓冲区中,其首地址由参数u8 *return_string指定,返回文件目录项的类型由u8 *ATTR传递,其值为返回文件或目录directory entry的attribute字段; 遍历DISK函数u8 disk_enumeration(u8 disk_,u8 *return_string,u8 mode,u8* ATTR)—该函数可以用于遍历指定DISK下所有的文件与目录,一次调用返回一个文件项或目录项,同时定义有二种遍历模式,mode(0)-调用后将复位到目录的第一个文件项或目录项重新开始,mode(1)-继续上一遍历后的目录项,被枚举磁盘ID(ID编号由0开始,到Maximum_Disks – 1)由参数u8 disk_来指定,遍历模式由参数char mode来指定,遍历返回的文件项或目录名存储于缓冲区中,其首地址由参数u8 *return_string指定,返回文件目录项的类型由u8 *ATTR传递,其值为返回文件或目录directory entry的attribute字段; 文件删除函数-- u8 delete_file(u8 *filename)—该函数用于删除文件系统中的一个文件,删除文件名通过参数char *filename指定. 目录删除函数-- u8 delete_folder(u8 * foldername)—该函数用于删除文件系统中的一个目录,删除目录名通过参数u8 *foldername指定,被删除目录必须是空目录; 文件查找函数—u8 find_file(u8 * filename,u8 mode, u8* folder_name )—文件查找函数支持2种模式:1)mode = 0:当前目录下查找;2)mode=1:在整个磁盘中查找;查找文件名通过参数char * filename来指定,查找模式通过参数u8 mode来指定,查找成功后文件加上其所在的目录的完整路径名字符串通过参数folder_name返回. 查询分区容量和剩余容量函数—u8 volume_inquiry(u8 partition_id,u32 *volume_capacity, u32 *volume_free_space);—该函数用于查询指定分区的分区容量与剩余空间,分区号通过参数u8 partition_id来指定,查询的结果分区容量将存入在参数u32 *volume_capacity中,查询的结果剩余容量将存入在参数u32 *volume_free_space中 例程 使用volume_inquiry(),查看分区容量和分区剩余容量 volume_inquiry('c',&cc,&bb); printf("Volume C Capacity: %ld\n",cc); printf("Volume C FreeSpace: %ld\n",bb); 在当前目录{C:\\}之下建立一个目录:CREATE_FOLDER_TEST create_floder("CREATE_FOLDER_TEST"); 在目录CREATE_FOLDER_TEST之下建立一个文件:created_file.txt create_file("C:\\CREATE_FOLDER_TEST\\created_file.txt"); 进入目录d:\\CREATE_FOLDER_TEST,并遍历目录d:\\CREATE_FOLDER_TEST的所有文件 cd_folder("d:\\CREATE_FOLDER_TEST",0); mode = 0; while(folder_enumeration(buf,mode,&ATTR) == SUCC) { printf("\nreaded entry=%s Attr = %x",buf,ATTR); mode = 1; } 返回根目录,并遍历根目录下的所有文件 cd_folder(" ",1); mode = 0; while(folder_enumeration(buf,mode,&ATTR) == SUCC) { printf("\nreaded entry=%s Attr = %x",buf,ATTR); mode = 1; } /* 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]盘符由C加1,成为D create_floder(buf)建一个disk_enumeration的目录 continue; } else //复制文件 { HANDLE1 = open_file(buf)打开文件 buf[0]盘符由C加1,成为D create_file(buf)在DISK1上建立文件, } if (HANDLE1 != FAIL) {HANDLE2 = open_file(buf)打开DISK1上建立的文件 do{复制文件 cc = read_file(HANDLE1,buf+400,50000)读文件 printf("\nreaded chars = %ld ",cc)打印读文件读取的字节数 write_file(HANDLE2,buf+400,cc)将读取的字节写去DISK1上的文件 if(cc != 50000)检查读取的字节数,确认文件尾 { close_file(HANDLE1)文件复制结束,关闭文件 close_file(HANDLE2); break; } }while(1); } else { printf("Openfile failed!"); } } { printf("Openfile failed!"); } }
  • 下载地址 (推荐使用迅雷下载地址,速度快,支持断点续传)
  • 免费下载 DOC格式下载
  • 您可能感兴趣的
  • mac格式转成fat32  hfs格式转成fat32  c盘fat32转换ntfs格式  c盘转换为fat32格式  c盘格式fat32  c盘fat32转ntfs格式  c盘格式为fat32  如何将exfat转成fat32  如何将fat32转成ntfs  怎么将fat32转成ntfs