tell_seek_dir_sample.c 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  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. #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. rt_kprintf("the directory is:\n");
  30. dirp = opendir("/");
  31. for (dp = readdir(dirp); dp != RT_NULL; dp = readdir(dirp))
  32. {
  33. /* 保存第三个目录项的目录指针*/
  34. i++;
  35. if (i == 3)
  36. save3 = telldir(dirp);
  37. rt_kprintf("%s\n", dp->d_name);
  38. }
  39. /* 回到刚才保存的第三个目录项的目录指针*/
  40. seekdir(dirp, save3);
  41. /* 检查当前目录指针是否等于保存过的第三个目录项的指针. */
  42. cur = telldir(dirp);
  43. if (cur != save3)
  44. {
  45. rt_kprintf("seekdir (d, %ld); telldir (d) == %ld\n", save3, cur);
  46. }
  47. /* 从第三个目录项开始打印*/
  48. rt_kprintf("the result of tell_seek_dir is:\n");
  49. for (dp = readdir(dirp); dp != NULL; dp = readdir(dirp))
  50. {
  51. rt_kprintf("%s\n", dp->d_name);
  52. }
  53. /* 关闭目录*/
  54. closedir(dirp);
  55. }
  56. /* 导出到 msh 命令列表中 */
  57. MSH_CMD_EXPORT(telldir_sample, telldir sample);