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

