tell_seek_dir_sample.c 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. /*
  2. * Copyright (c) 2006-2018, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. *
  9. */
  10. /*
  11. * 程序清单:保存与设置读取目录位置
  12. *
  13. * 程序会创建一个操作文件的函数并导出到msh命令列表
  14. * 在函数中调用 telldir() 函数
  15. * off_t telldir(DIR *d); 获取目录流的读取位置
  16. * void seekdir(DIR *d, off_t offset); 设置下次读取目录的位置
  17. */
  18. #include <rtthread.h>
  19. #include <dfs_posix.h> /* 当需要使用文件操作时,需要包含这个头文件 */
  20. /* 假设文件操作是在一个线程中完成 */
  21. static void telldir_sample(void)
  22. {
  23. DIR *dirp;
  24. int save3 = 0;
  25. int cur;
  26. int i = 0;
  27. struct dirent *dp;
  28. /* 打开根目录 */
  29. dirp = opendir("/");
  30. for (dp = readdir(dirp); dp != RT_NULL; dp = readdir(dirp))
  31. {
  32. /* 保存第三个目录项的目录指针*/
  33. i++;
  34. if (i == 3)
  35. save3 = telldir(dirp);
  36. rt_kprintf("%s\n", dp->d_name);
  37. }
  38. /* 回到刚才保存的第三个目录项的目录指针*/
  39. seekdir(dirp, save3);
  40. /* 检查当前目录指针是否等于保存过的第三个目录项的指针. */
  41. cur = telldir(dirp);
  42. if (cur != save3)
  43. {
  44. rt_kprintf("seekdir (d, %ld); telldir (d) == %ld\n", save3, cur);
  45. }
  46. /* 从第三个目录项开始打印*/
  47. for (dp = readdir(dirp); dp != NULL; dp = readdir(dirp))
  48. rt_kprintf("%s\n", dp->d_name);
  49. /* 关闭目录*/
  50. closedir(dirp);
  51. }
  52. /* 导出到 msh 命令列表中 */
  53. MSH_CMD_EXPORT(telldir_sample, telldir sample);