在 Debian(以及其他 Linux 发行版、遵循 POSIX 的系统)中,opendir 是用来**打开一个目录流(directory stream)**的函数,定义在 <dirent.h> 中,常用于 C 语言程序中遍历目录。
下面从基本用法、示例代码、常见错误、注意事项几个方面说明。
#include <dirent.h>
DIR *opendir(const char *name);
DIR* 的目录流指针NULL,并设置 errno典型用法分为三步:
opendir() 打开目录readdir() 读取目录项closedir() 关闭目录#include <stdio.h>
#include <dirent.h>
#include <errno.h>
int main(int argc, char *argv[])
{
DIR *dir;
struct dirent *entry;
if (argc < 2) {
fprintf(stderr, "Usage: %s <directory>\n", argv[0]);
return 1;
}
dir = opendir(argv[1]);
if (dir == NULL) {
perror("opendir");
return 1;
}
while ((entry = readdir(dir)) != NULL) {
printf("%s\n", entry->d_name);
}
closedir(dir);
return 0;
}
gcc listdir.c -o listdir
./listdir /etc
dir = opendir("/root");
if (!dir) {
perror("opendir");
}
可能错误:
ENOENT:目录不存在EACCES:权限不足✅ 解决:
ls -ld 目录 检查权限closedir❌ 错误:
opendir("/tmp");
// 忘记 closedir
✅ 正确:
closedir(dir);
否则会造成文件描述符泄漏
dirent 中只有文件名,不能直接判断是文件还是目录
✅ 正确方式:
#include <sys/stat.h>
struct stat st;
stat(entry->d_name, &st);
if (S_ISDIR(st.st_mode)) {
// 是目录
}
或(推荐):
entry->d_type == DT_DIR
⚠️ 注意:d_type 在某些文件系统上可能不可靠(如某些网络文件系统)
opendir 底层使用 open() + getdents()opendir("symlink_to_dir") ✅ 可以opendir + fstatglob():匹配文件名nftw():递归遍历目录std::filesystem(C++17)如果你有具体使用场景(比如:
可以告诉我,我可以给你更针对性的示例。