在 Debian(或任何 Linux 系统)上使用 readdir 系列函数读取目录时,“释放资源”主要涉及 关闭目录流 和 释放相关内存。下面按常见使用方式说明。
opendir / readdir / closedir(最常见)#include <dirent.h>
#include <stdio.h>
int main() {
DIR *dir = opendir("/path/to/dir");
if (!dir) {
perror("opendir");
return 1;
}
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
printf("%s\n", entry->d_name);
}
closedir(dir); // ✅ 释放目录资源
return 0;
}
opendir() 返回一个 DIR *readdir() 不需要 手动释放返回值closedir(dir)
readdir_r(线程安全版本)DIR *dir = opendir("/path/to/dir");
struct dirent entry;
struct dirent *result;
while (readdir_r(dir, &entry, &result) == 0 && result != NULL) {
printf("%s\n", entry.d_name);
}
closedir(dir);
entry 是栈上变量closedir(dir)fdopendir(基于文件描述符)int fd = open("/path/to/dir", O_RDONLY);
DIR *dir = fdopendir(fd);
readdir(dir);
closedir(dir); // ✅ 同时关闭 fd
⚠️ 注意:
closedir(dir) 后:
close(fd)DIR *dir = opendir(".");
readdir(dir);
// 忘记 closedir → 文件描述符泄漏
struct dirent *e = readdir(dir);
free(e); // ❌ 错误,会导致崩溃
| 操作 | 是否需要释放 |
|---|---|
opendir |
需要 closedir |
readdir 返回值 |
❌ 不需要释放 |
DIR * |
✅ closedir |
fdopendir 的 fd |
✅ 由 closedir 关闭 |
如果你用的是 C++ / Rust / Python,或者是 大量目录遍历场景(递归、多线程),我可以给你更具体的建议。