OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7031|回复: 6

FatFs文件系统实验中,f_readdir读取文件目录时出现读取不到的问题

[复制链接]

6

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
100
金钱
100
注册时间
2019-5-5
在线时间
16 小时
发表于 2019-7-12 17:08:59 | 显示全部楼层 |阅读模式
1金钱
我在测试f_readdir这个函数功能时,设计功能:读取当前目录下所有文件夹或者文件,并把文件名打印在LCD屏上。
当我采用如下代码时,屏幕上不会打印任何信息,该函数在main中被调用,且显示函数也在main中调用,这里通过定义了
FILINFO的全局结构体数组来保存这些文件信息,然后再main函数中打印这些信息。

但是当我把下面注释的LCD_ShowString函数不注释,然后main函数那边不显示信息,这样在屏幕上反而是可以打印出来信息的。

提问:是不是文件夹在关闭以后,这些和文件或者文件夹相关的FILINFO变量也被清除了。
FRESULT Scan_Files(const TCHAR* path)
{
    FRESULT result;
    DIR dir;
    FILINFO fileinfo;

    unsigned int num = 0;

    result = f_opendir(&dir,(const TCHAR*)path);          //打开文件夹
    if(result != FR_OK) return result;

    while(1)
    {
        result = f_readdir(&dir,&fileinfo);
        if (result != FR_OK || fileinfo.fname[0] == 0) break;       //出现错误或者到了结尾
        //是文件夹
        if (fileinfo.fattrib & AM_DIR)
        {                  
            ;
        }
        //是文件
        else
        {                                      
            ;
        }

        // LCD_ShowString(50,340+num*18,400,18,16,fileinfo.fname);
        num++;
    }
    f_closedir(&dir);               //关闭文件夹

    return result;
}


code.png

最佳答案

查看完整内容[请看2#楼]

好了,问题找出来了,是运算优先级的问题,倒数第六行代码,*num++,更换成(*num)++就好了。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
100
金钱
100
注册时间
2019-5-5
在线时间
16 小时
 楼主| 发表于 2019-7-12 17:09:00 | 显示全部楼层
好了,问题找出来了,是运算优先级的问题,倒数第六行代码,*num++,更换成(*num)++就好了。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2019-7-13 02:37:25 | 显示全部楼层
代码看起来ok,打开文件后,不要关闭,否则读取可能会有问题。
回复

使用道具 举报

6

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
100
金钱
100
注册时间
2019-5-5
在线时间
16 小时
 楼主| 发表于 2019-7-14 10:04:56 | 显示全部楼层
重新把代码贴出来
  1. FRESULT scan_files(const TCHAR* path,FILINFO *fileinfo,BYTE *num)
  2. {
  3.     FRESULT result;
  4.     DIR dir;

  5.     *num = 0;
  6.    
  7.     result = f_opendir(&dir,(const TCHAR*)path);          //打开文件夹
  8.     if(result != FR_OK) return result;

  9.     while(1)
  10.     {
  11.         result = f_readdir(&dir,(fileinfo+*num));
  12.         if (result != FR_OK || (fileinfo+*num)->fname[0] == 0) break;       //出现错误或者到了结尾
  13.         //是文件夹
  14.         if ((fileinfo+*num)->fattrib & AM_DIR)
  15.         {                  
  16.             ;
  17.         }
  18.         //是文件
  19.         else
  20.         {                                      
  21.             ;
  22.         }
  23.         (*num)++;
  24.     }
  25.     f_closedir(&dir);               //关闭文件夹

  26.     return result;
  27. }
复制代码
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2019-7-15 01:55:31 | 显示全部楼层
lyj41801 发表于 2019-7-14 10:04
重新把代码贴出来

谢谢分享
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

0

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
199
金钱
199
注册时间
2019-6-20
在线时间
47 小时
发表于 2019-9-20 11:27:37 | 显示全部楼层
lyj41801 发表于 2019-7-14 10:04
重新把代码贴出来

你好请问一下,假如我要遍历根目录下的文件,我的路径应该怎么写呢?
回复

使用道具 举报

6

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
100
金钱
100
注册时间
2019-5-5
在线时间
16 小时
 楼主| 发表于 2019-10-28 09:25:52 | 显示全部楼层
zxy0427 发表于 2019-9-20 11:27
你好请问一下,假如我要遍历根目录下的文件,我的路径应该怎么写呢?

用"0:",数字用你定义的更换就好
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-1 02:24

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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