在 Debian(或任何 Linux)系统上,readdir() 返回“空”通常并不是函数本身出错,而是使用方式或环境导致看起来没有内容。下面按最常见原因逐一说明。
opendir() 成功readdir() 必须在有效的 DIR* 上调用:
DIR *dir = opendir("/some/path");
if (!dir) {
perror("opendir");
return;
}
如果 opendir() 失败(权限不足、路径不存在),readdir() 永远返回 NULL。
readdir() 返回 NULL 当成“空目录”很多人误以为:
if (readdir(dir) == NULL)
printf("目录为空\n");
这是错误的。
readdir():
struct dirent * → 有文件NULL → 遍历结束或出错正确写法:
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
printf("%s\n", entry->d_name);
}
Debian 上很多目录可能真的没有可见文件,例如:
/proc/xxx 特殊情况)可用命令确认:
ls -la /path
即使你能 cd 进目录,也可能无法 readdir:
ls -ld /path
如果权限是:
drwx------ root root
普通用户会:
opendir() 成功readdir() 返回 NULLerrno == EACCES解决:
sudoDIR* 是有状态的:
readdir(dir); // 读了一个
readdir(dir); // 又读了一个
// 再调用可能直接 NULL
如果你:
就会“看起来是空的”。
telldir()/seekdir() 或 rewinddir() 错误如果:
seekdir 到非法位置readdir() 可能直接返回 NULL。
在 Debian 上:
/proc/sys可能出现:
opendir() 成功readdir() 返回很少或 NULLls 能看到内容这是内核/文件系统行为,不是 bug。
readdir() 不是异步信号安全DIR* 未加锁也会异常readdir_r() 但用错了旧接口:
readdir_r(dir, &entry, &result);
if (result == NULL) ...
很多人把 result 和 entry 搞混。
opendir() 是否成功?while 循环读取?errno 是什么?ls -la 是否能看到文件?如果你愿意,可以把:
errno 值贴出来,我可以直接帮你定位是哪一条原因。