纬图虚拟仪器论坛

 找回密码
 立即注册
搜索
查看: 35075|回复: 8

FATFS中的 f_readdir的不解,求指教!谢谢!

[复制链接]
发表于 2012-12-10 22:03:19 | 显示全部楼层 |阅读模式

/*
*********************************************************************************************************
* 函 数 名: ViewRootDir
* 功能说明: 显示SD卡根目录下的文件名
* 形    参:无
* 返 回 值: 无
*********************************************************************************************************
*/
static void ViewRootDir(void)
{
/* 本函数使用的局部变量占用较多,请修改启动文件,保证堆栈空间够用 */
FRESULT result;
FATFS fs;
DIR DirInf;  
FILINFO FileInf;

uint8_t tmpStr[20];
uint32_t cnt = 0;

  /* 挂载文件系统 */
result = f_mount(0, &fs);   /* Mount a logical drive */
if (result != FR_OK)
{
  printf("FileSystem Mounted Failed (%d)\r\n", result);
}
/* 打开根文件夹 */
result = f_opendir(&DirInf, "/"); /* 如果不带参数,则从当前目录开始 */
if (result != FR_OK)
{
  printf("Open Root Directory Error (%d)\r\n", result);
  return;
}
/* 读取当前文件夹下的文件和目录 */
printf("Name\t\tTyepe\t\tSize\r\n");
for (cnt = 0; ;cnt++)
{
  result = f_readdir(&DirInf,&FileInf);   /* 读取目录项,索引会自动下移 */
  if (result != FR_OK || FileInf.fname[0] == 0)
  {
   break;
  }
  
  if (FileInf.fname[0] == '.')
  {
   continue;
  }
  
  printf("%s", FileInf.fname);
  if (strlen(FileInf.fname) < 8) /* 对齐 */
  {
   printf("\t\t");
  }
  else
  {
   printf("\t");
  }
  if (FileInf.fattrib == AM_DIR)
  {
   printf("Directory\t");
  }
  else
  {
   printf("File\t\t");
  }
  printf("%d\r\n", FileInf.fsize);
  sprintf((char *)tmpStr, "%d", FileInf.fsize);
}
/* 卸载文件系统 */
f_mount(0, NULL);
}



请教下这个语句是什么意思?
if (FileInf.fname[0] == '.')
  {
   continue;
  }

还有文件夹的名字是怎么传递到FileInf.fname数组中那?

谢谢!
回复

使用道具 举报

发表于 2012-12-11 09:44:58 | 显示全部楼层
根据这段程序,if (FileInf.fname[0] == '.'){continue;}的意思是,如果文件名字是'.'开头的就直接进入下次循环,也就是说对'.’开头的文件不做处理(这里说的文件也包括文件夹,也就是说文件夹也是一种文件),这种做法有一定的道理的,在linux系统中,一般以'.'开头的文件都是隐藏文件,所以一般是不给显示的。结合这里的程序,这种解释就比较合理了。
回复 支持 反对

使用道具 举报

发表于 2012-12-11 10:16:27 | 显示全部楼层
还有一种解释,也是linux里面的,下面是FATFS官方对读目录的说明:
DescriptionThe f_readdir function reads directory entries in sequence. All items in the directory can be read by calling f_readdir function repeatedly. When all directory entries have been read and no item to read, the function returns a null string into f_name[] member without any error. When a null pointer is given to the FileInfo, the read index of the directory object will be rewinded.
When LFN feature is enabled, lfname and lfsize in the file information structure must be initialized with valid value prior to use the f_readdir function. The lfname is a pointer to the string buffer to return the long file name. The lfsize is the size of the string buffer in unit of TCHAR. If either the size of read buffer or LFN working buffer is insufficient for the LFN or the object has no LFN, a null string will be returned to the LFN read buffer. If the LFN contains any charactrer that cannot be converted to OEM code, a null string will be returned but this is not the case on Unicode API configuration. When lfname is a NULL, nothing of the LFN is returned. When the object has no LFN, some small capitals can be contained in the SFN.
When relative path feature is enabled (_FS_RPATH == 1), "." and ".." entries are not filtered out and it will appear in the read entries.

注意最后一句,在linux系统中,每个目录下都有'.'和'..'这个两个文件,具体是什么东西,有什么用我也不太清楚,只有期待高人来解答了。




回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-12-13 15:52:07 | 显示全部楼层
万分感激!谢谢!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-12-13 15:57:51 | 显示全部楼层
wdluo 发表于 2012-12-11 09:44
根据这段程序,if (FileInf.fname[0] == '.'){continue;}的意思是,如果文件名字是'.'开头的就直接进入下次 ...

linux膜拜,我何时才能有你的功力,呵呵!
回复 支持 反对

使用道具 举报

发表于 2012-12-13 16:01:19 | 显示全部楼层
viewtool1 发表于 2012-12-13 15:57
linux膜拜,我何时才能有你的功力,呵呵!

其实我也只是了解一点而已,没什么功底
回复 支持 反对

使用道具 举报

发表于 2013-2-5 23:13:16 | 显示全部楼层
result = f_readdir(&DirInf,&FileInf);   这里会读到文件名
回复 支持 反对

使用道具 举报

发表于 2013-2-6 14:18:58 | 显示全部楼层
大哥们我也正在纠结这个问题你们都是大神哇谢谢
回复 支持 反对

使用道具 举报

发表于 2013-2-6 14:20:44 | 显示全部楼层
result = f_opendir(&DirInf, "/"); /* 如果不带参数,则从当前目录开始 */里面的当前目录是指什么东西一般的文件系统中有很多个文件夹这个当前的怎么理解
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|纬图虚拟仪器

GMT+8, 2024-12-22 18:44 , Processed in 2.612150 second(s), 14 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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