You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用dirent.h时,多次调用readdir循环是否需重置目录指针?

关于dirent.h多次遍历目录的重置问题

答案是肯定的:第一次遍历结束后必须把目录流重置到起始位置,否则第二个readdir循环会直接跳过——因为第一次遍历已经把目录指针移到了末尾,后续调用readdir只会返回NULL,循环根本不会执行。

重置方法

最直接的方式是用rewinddir()函数,它专门用来将目录流重置到起始位置,用法很简单,直接传入你的目录指针即可:

rewinddir(folder);

修正后的示例代码

#include <dirent.h>

int main() {
    DIR *folder = opendir("./");
    struct dirent *entry;

    // 第一次遍历
    while ((entry = readdir(folder)) != NULL) {
        // 处理文件/目录逻辑
    }

    // 重置目录流到开头
    rewinddir(folder);

    // 第二次遍历
    while ((entry = readdir(folder)) != NULL) {
        // 再次处理文件/目录逻辑
    }

    closedir(folder);
    return 0;
}

额外说明

如果需要更灵活的位置控制(比如记录某个中间位置之后跳转回去),可以配合telldir()和seekdir():

// 记录当前目录流位置
long start_pos = telldir(folder);

// 后续需要重置到该位置时
seekdir(folder, start_pos);

不过对于从头开始的二次遍历,rewinddir()已经足够简洁好用。

内容的提问来源于stack exchange,提问作者ImSuffering

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 03:27:37