You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用FatFs的f_mkdir()创建目录时出现异常重复项求助

排查FatFs创建目录后出现同名子项的问题

首先看你给出的这段代码逻辑,核心判断其实有个容易踩的细节坑:FatFs的返回值里,FR_OK是0,而FR_NO_FILE(表示目标对象不存在)是1,FR_NO_PATH是2,这些错误码都大于FR_OK。所以你的判断if(iFResult > FR_OK)确实会在/SENT不存在时触发创建,这部分逻辑本身是没问题的。那问题大概率出在其他地方,或者是一些容易忽略的细节:

1. 检查后续代码是否有错误的路径操作

最常见的情况是,你在创建/SENT目录之后,有其他代码误在该目录下创建了同名的文件或子目录:

  • 比如后续调用f_mkdir("SENT")时,当前工作目录已经切换到了/SENT(比如之前调用过f_chdir("/SENT")),这就会在/SENT内部创建一个新的SENT子目录。
  • 或者调用f_open("SENT", FA_CREATE_ALWAYS | FA_WRITE)时,当前目录是/SENT,这会在该目录下生成一个名为SENT的空文件(因为FatFs不允许用f_open打开目录,所以会直接创建文件)。

2. 确认FatFs配置是否正确

检查你的FatFs配置头文件(比如ffconf.h):

  • 确保_USE_DIR被设置为1,这是FatFs支持目录操作的必要配置,如果这个选项关闭,f_mkdir的行为可能会异常。
  • 确认_FS_RPATH(相对路径支持)的设置,如果开启了相对路径,要格外注意当前工作目录的变化。

3. 优化f_stat的判断逻辑以避免误判

虽然你的代码看起来没问题,但可以做个小优化来明确逻辑,避免因为其他错误触发不必要的创建操作:

iFResult = f_stat("/SENT", &File_Info);
// 明确判断:只有当返回FR_NO_FILE或FR_NO_PATH时才创建目录
if (iFResult == FR_NO_FILE || iFResult == FR_NO_PATH) {
    iFResult = f_mkdir("/SENT");
    // 这里可以加个错误判断,确认目录是否创建成功
    if (iFResult != FR_OK) {
        // 处理创建失败的情况,比如打印错误码
    }
}

这样的判断更精准,不会因为磁盘读写错误等其他异常也执行创建操作。

4. 排查是否有重复执行创建逻辑的情况

比如这段代码是否被放在了循环里,或者在中断服务函数中被重复调用?如果多次执行,虽然f_stat会检测到目录已存在,但如果中间有其他操作删除了/SENT目录,就可能再次创建,但这一般不会导致子目录出现同名项,不过可以排查确认。

最后建议你在创建目录后,立即用f_opendir打开/SENT,遍历目录内容,确认这个额外的SENT是创建后立即出现的,还是后续操作才生成的,这样能更快定位问题。

内容的提问来源于stack exchange,提问作者DEV

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:52:24