tell_seek_dir_sample.c 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. /*
  2. * Copyright (c) 2006-2022, 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. #if RT_VER_NUM >= 0x40100
  20. #include <fcntl.h> /* 当需要使用文件操作时,需要包含这个头文件 */
  21. #else
  22. #include <dfs_posix.h>
  23. #endif /*RT_VER_NUM >= 0x40100*/
  24. /* 假设文件操作是在一个线程中完成 */
  25. static void telldir_sample(void)
  26. {
  27. DIR *dirp;
  28. int save3 = 0;
  29. int cur;
  30. int i = 0;
  31. struct dirent *dp;
  32. /* 打开根目录 */
  33. rt_kprintf("the directory is:\n");
  34. dirp = opendir("/");
  35. for (dp = readdir(dirp); dp != RT_NULL; dp = readdir(dirp))
  36. {
  37. /* 保存第三个目录项的目录指针*/
  38. i++;
  39. if (i == 3)
  40. save3 = telldir(dirp);
  41. rt_kprintf("%s\n", dp->d_name);
  42. }
  43. /* 回到刚才保存的第三个目录项的目录指针*/
  44. seekdir(dirp, save3);
  45. /* 检查当前目录指针是否等于保存过的第三个目录项的指针. */
  46. cur = telldir(dirp);
  47. if (cur != save3)
  48. {
  49. rt_kprintf("seekdir (d, %ld); telldir (d) == %ld\n", save3, cur);
  50. }
  51. /* 从第三个目录项开始打印*/
  52. rt_kprintf("the result of tell_seek_dir is:\n");
  53. for (dp = readdir(dirp); dp != NULL; dp = readdir(dirp))
  54. {
  55. rt_kprintf("%s\n", dp->d_name);
  56. }
  57. /* 关闭目录*/
  58. closedir(dirp);
  59. }
  60. /* 导出到 msh 命令列表中 */
  61. MSH_CMD_EXPORT(telldir_sample, telldir sample);