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

Elm Chan FatFs中f_chdir切换目录后未更新结构,如何读取目标文件?

问题描述

文件夹结构

- A1
  |- A11
  |   |- A11.mp3
  |- A12
  |   |- A12.mp3
  |- A1.mp3

- A2
  |- A21
  |   |- A21.mp3
  |- A22
  |   |- A22.mp3
  |- A2.mp3

执行代码及问题

运行以下代码:

root_path = "/A1";
newPath = "/A1/A11";
f_opendir(dir,root_path );
f_chdir(newPath);
f_readdir(dir,fno);// 结果为fno.fname = "/A12"

需要修改代码,让f_readdir(dir,fno)返回fno.fname = "A11.mp3"。

解决方案

核心问题:f_opendir创建的目录句柄dir和打开时的目标目录(/A1)绑定,调用f_chdir只是改变当前工作目录,不会修改已打开句柄指向的目录。要读取A11下的文件,必须打开A11目录的句柄,再用该句柄调用f_readdir。

方案1:直接打开目标目录

最简洁的写法,跳过不必要的步骤:

// 指定目标目录路径
target_path = "/A1/A11";
// 打开A11目录
if(f_opendir(dir, target_path) == FR_OK) {
    // 读取目录内容(部分文件系统会先返回.和..,需要过滤)
    while(f_readdir(dir, fno) == FR_OK) {
        // 跳过当前目录.和上级目录..
        if(strcmp(fno.fname, ".") != 0 && strcmp(fno.fname, "..") != 0) {
            // 此时fno.fname即为"A11.mp3"
            break;
        }
    }
}

方案2:关闭原句柄后重新打开目标目录

如果必须保留先打开/A1的逻辑,可按如下修改:

root_path = "/A1";
newPath = "/A1/A11";
f_opendir(dir, root_path);
// 关闭原目录句柄
f_closedir(dir);
// 打开A11目录
if(f_opendir(dir, newPath) == FR_OK) {
    // 过滤.和..后读取目标文件
    while(f_readdir(dir, fno) == FR_OK) {
        if(strcmp(fno.fname, ".") != 0 && strcmp(fno.fname, "..") != 0) {
            break;
        }
    }
}

关键提示

部分嵌入式文件系统(如FatFs)的f_readdir会先返回.(当前目录)和..(上级目录),之后才返回实际文件/文件夹,因此需要通过循环过滤这两个条目才能拿到A11.mp3。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 06:00:59