硬汉嵌入式论坛

 找回密码
 立即注册
查看: 5869|回复: 8
收起左侧

[FatFs] FatFS不支持在文件任意位置插入数据,仅支持在文件末尾插入数据,附测试代码

[复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106749
QQ
发表于 2016-5-11 10:39:30 | 显示全部楼层 |阅读模式
测试代码:
  1. /*
  2. *********************************************************************************************************
  3. *    函 数 名: CreateNewFile
  4. *    功能说明: 在SD卡创建一个新文件,文件内容填写“www.armfly.com”
  5. *    形    参:无
  6. *    返 回 值: 无
  7. *********************************************************************************************************
  8. */
  9. static void CreateNewFile(void)
  10. {
  11.     /* 本函数使用的局部变量占用较多,请修改启动文件,保证堆栈空间够用 */
  12.     FRESULT result;
  13.     FATFS fs;
  14.     FIL file;
  15.     DIR DirInf;
  16.     uint32_t bw;

  17.      /* 挂载文件系统 */
  18.     result = f_mount(&fs, "0:", 0);            /* Mount a logical drive */
  19.     if (result != FR_OK)
  20.     {
  21.         printf("挂载文件系统失败 (%s)\r\n", FR_Table[result]);
  22.     }

  23.     /* 打开根文件夹 */
  24.     result = f_opendir(&DirInf, "0:"); /* 如果不带参数,则从当前目录开始 */
  25.     if (result != FR_OK)
  26.     {
  27.         printf("打开根目录失败  (%s)\r\n", FR_Table[result]);
  28.         return;
  29.     }

  30.     /* 打开文件 */
  31.     result = f_open(&file, "0:/armfly.txt";, FA_OPEN_ALWAYS | FA_WRITE);
  32.     result = f_write(&file, "FatFS Write Demo \r\n www.armfly.com \r\n", 34, &bw);
  33.     if (result == FR_OK)
  34.     {
  35.         printf("armfly.txt 文件写入成功\r\n");
  36.     }
  37.     else
  38.     {
  39.         printf("armfly.txt 文件写入失败  (%s)\r\n", FR_Table[result]);
  40.     }
  41.     f_close(&file);
  42.    
  43.     result = f_open(&file, "0:/armfly.txt", FA_OPEN_ALWAYS | FA_WRITE);
  44.     f_lseek(&file, 34);
  45.     result = f_write(&file, "FatFS Write Demo \r\n www.armfly.com \r\n", 34, &bw);
  46.     if (result == FR_OK)
  47.     {
  48.         printf("armfly.txt 文件写入成功\r\n");
  49.     }
  50.     else
  51.     {
  52.         printf("armfly.txt 文件写入失败  (%s)\r\n", FR_Table[result]);
  53.     }
  54.     f_close(&file);

  55.     /* 卸载文件系统 */
  56.      f_mount(NULL, "0:", 0);
  57. }
复制代码

插入末尾的效果:
1.png
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106749
QQ
 楼主| 发表于 2016-5-11 11:01:37 | 显示全部楼层
f_open使用属性:FA_CREATE_ALWAYS | FA_WRITE 或者仅使用 FA_WRITE 也可以实现同样的功能。
不过一定要配合函数f_lseek一起使用。
1.png
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106749
QQ
 楼主| 发表于 2016-5-11 12:17:36 | 显示全部楼层
如果在任意位置插入的话会发生覆盖操作。
回复

使用道具 举报

0

主题

1

回帖

0

积分

新手上路

积分
0
发表于 2016-5-11 12:44:29 | 显示全部楼层
硬汉大哥解决问题就是迅速。支持[s:142]
回复

使用道具 举报

13

主题

192

回帖

231

积分

高级会员

积分
231
发表于 2020-10-14 18:41:15 | 显示全部楼层
硬汉哥,你测试的这个是哪个版本的FatFS,目前我碰到了同样的问题,任意位置写入,结果覆盖了。我是配合f_lseek来使用的,目前使用的版本是0.12.c
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106749
QQ
 楼主| 发表于 2020-10-15 13:16:39 | 显示全部楼层
zhang0352505 发表于 2020-10-14 18:41
硬汉哥,你测试的这个是哪个版本的FatFS,目前我碰到了同样的问题,任意位置写入,结果覆盖了。我是配合f_l ...

不是0.10就是0.9
回复

使用道具 举报

3

主题

59

回帖

68

积分

初级会员

积分
68
发表于 2020-12-15 10:09:07 | 显示全部楼层
现在用keil v6版本的File System,我也是先用fseek定位坐标后,再在坐标处写入数据。
数据可以正常(覆盖)写入,但是fwrite会报错fsError(值为1),打开文件是用的"r+"
不知道有什么正确的操作方法(我的目的是在文件开头预留一段位置,后期当这个数据需要存储的时候要覆盖到文件开头,这段信息是要求在文件开头的,不是我能改变的)
回复

使用道具 举报

3

主题

59

回帖

68

积分

初级会员

积分
68
发表于 2020-12-15 10:12:55 | 显示全部楼层
本帖最后由 ruboss 于 2020-12-15 11:17 编辑

重复提交了两次回复,手机上不太好编辑信息
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106749
QQ
 楼主| 发表于 2020-12-16 10:50:49 | 显示全部楼层
ruboss 发表于 2020-12-15 10:09
现在用keil v6版本的File System,我也是先用fseek定位坐标后,再在坐标处写入数据。
数据可以正常(覆盖 ...

老版的RL-FlashFS可以这么玩,新版前段时间我这么玩也出问题,最近制作RL-FlashFS教程,再研究研究。
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-4 07:27 , Processed in 0.331087 second(s), 34 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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