使用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
相关产品推荐
相关产品推荐

