硬汉嵌入式论坛

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

[FileX] 求救:Filex的Exfat格式支持,是不是有问题

[复制链接]

2

主题

11

回帖

17

积分

新手上路

积分
17
发表于 2025-4-19 19:15:56 | 显示全部楼层 |阅读模式
请教大佬:

我在用filex时候,打开了exfat 和 容错功能,当进行如下测试时,读数据必出异常:
1. 用 write 的方式打开一个文件(文件不存在的话,我会创建一个新文件),并调用 fx_file_extended_truncate_release 将长度截断为0,并seek到 begin的位置
2. 向文件里写入 7 个字节,然后close文件;
3. 再次用 write 的方式打开同一个文件,并调用 fx_file_extended_truncate_release 将长度截断为0;并seek到 begin的位置
4. 再向文件里,写入4个字节,然后close文件;
5. 用 read 的方式打开这个文件,然后读出文件,这时候,居然读出来7个字节;

如果,我在前面的基础上,后续重复步骤 3~5, 读出来的数据,都是最近一次写入的数据。

求教下大佬,这个是不是 filex 的 bug?或者说,我这个用法,哪里用的不对?

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116197
QQ
发表于 2025-4-21 01:14:08 | 显示全部楼层
楼主这里为什么要调用fx_file_extended_truncate_release

这个函数确实没用过。
回复

使用道具 举报

2

主题

11

回帖

17

积分

新手上路

积分
17
 楼主| 发表于 2025-4-21 09:23:07 | 显示全部楼层
eric2013 发表于 2025-4-21 01:14
楼主这里为什么要调用fx_file_extended_truncate_release

这个函数确实没用过。

因为封装了一层文件接口,用 w+ 的方式打开时候,都需要先覆盖文件,所以用了个truncate_release。

另外,我看到你发的另外一个帖子里,说文件只能写一次,感觉我的现象跟这个描述很像。具体就是:

第一次创建文件,以write的方式打开,写入几个字符,然后close掉。
第二次继续用write的方式打开,调一下fx_file_extended_relative_seek,也写入几个字符,然后close掉。
第三次用write方式,就打不开文件了,报文件损坏

这种问题,请问有遇到过么?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116197
QQ
发表于 2025-4-22 12:34:25 | 显示全部楼层
alulu 发表于 2025-4-21 09:23
因为封装了一层文件接口,用 w+ 的方式打开时候,都需要先覆盖文件,所以用了个truncate_release。

另 ...

后面我试试,这种方式我还没测试过
回复

使用道具 举报

2

主题

11

回帖

17

积分

新手上路

积分
17
 楼主| 发表于 2025-4-30 15:08:45 | 显示全部楼层
现在从我的测试结果看来,这种操作肯定会出错,但是具体原因还不知道是为啥。
对于write方式打开一个已有数据的文件,如果是append到最后,这个文件关闭后,再重新打开是没问题的。
但是,如果seek到中间,或者seek到 begin位置写入新数据,覆盖旧数据,那close之后,再打开就会报corrupt。

也不知道这是不是fx对文件使用的常规限制,文档里也没发现有任何类似的描述。
回复

使用道具 举报

2

主题

11

回帖

17

积分

新手上路

积分
17
 楼主| 发表于 昨天 10:05 | 显示全部楼层
解释下之前的问题:
回复

使用道具 举报

2

主题

11

回帖

17

积分

新手上路

积分
17
 楼主| 发表于 昨天 10:29 | 显示全部楼层
解释下之前的问题:(根因仍然没找到)
用filex 的fat32格式和exfat格式,分别打开容错做了一下对比测试:
exfat:
1. 用append的方式打开文件并写入数据,不管是空文件,还是已有数据的文件,都可以正常写入。
2. 用覆盖的方式写入数据(数据长度不超过已有数据长度),会导致fat表里出现一个死循环;这个死循环是从旧数据末尾开始(用于存新数据的cluster),尾部会根据覆盖所写入的长度进行调整

fat32
不管用什么方式打开文件,都可以正常写入数据。

扒了下file_write这个函数:
1. fx 会根据新写入的数据长度,搜索新的cluster,不管是覆盖写入还是append写入;(当然,如果是exfat格式,会有流式扩展的概念,这里如果是覆盖的方式写入,exfat会修改文件的搜索方式,从bitmap搜索改为fat表搜索,之后就会一直用fat表搜索)
2. 当搜索到足够的cluster用来存储新数据时,容错日志记录下来旧的cluster链表(被覆盖的部分)和新写入的cluster链表,同时更新fat表 和 bitmap;(这里fat表更新,会根据覆盖的位置进行替换,被覆盖的cluster链表头部的上一个节点,会指向新的cluster链表的头部; 新链表的尾部会指向旧链表尾部的下一个节点,这样就完成了链表替换,如果是从头开始替换,同时还会更新目录项中的文件入口cluster)
3. 之后写入数据,fx 会处理一些特殊场景,比如cluster和sector不对齐,fx会回读对应sector后覆盖再写回,这些不重要,基本没什么问题。
4. 最后更新容错日志 和 目录项

从流程上看,基本是没啥问题的,我怀疑更新fat表的时候,exfat对于旧fat表的末尾结束标志计算有问题,但没抓写入fat表时的cache数据。
问题记录下,以后有时间再回头来扒。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-10 02:23 , Processed in 0.243009 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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