在 Debian(或其他 Linux 系统)上,readdir() 返回“文件失败”通常不是 readdir() 本身的问题,而是调用方式或环境出了问题。下面按常见原因逐一说明,并给出排查方法。
readdir() 返回 NULL 不一定代表“没文件”,更可能是目录根本没打开。
DIR *dir = opendir("/some/path");
if (!dir) {
perror("opendir");
return;
}
✅ 检查:
ls -ld /some/path
即使你能 cd 进去,程序也可能失败,尤其是:
ls -l /path
错误示例:
Permission denied
✅ 解决:
opendir("/var/log/mylog")
如果它是软链:
/var/log/mylog -> /mnt/nas/log (未挂载)
opendir() 会失败。
✅ 检查:
ls -l /path
readlink /path
错误写法:
while ((entry = readdir(dir)) != NULL) {
...
}
但如果 dir == NULL,直接崩或行为异常。
✅ 正确流程:
DIR *dir = opendir(path);
if (!dir) {
perror("opendir");
return -1;
}
readdir() 返回 NULL 且 errno == 0:
✅ 表示目录读完,不是错误
errno = 0;
entry = readdir(dir);
if (!entry && errno != 0) {
perror("readdir");
}
Debian 常见场景:
现象:
ls 可以readdir 失败✅ 检查:
mount | grep path
dmesg | tail
老代码在 64 位系统上:
#define _FILE_OFFSET_BITS 64
否则大目录可能异常。
✅ 编译建议:
gcc -D_FILE_OFFSET_BITS=64 main.c
#define _GNU_SOURCE
#include <dirent.h>
#include <stdio.h>
#include <errno.h>
int main(int argc, char *argv[]) {
if (argc < 2) return 1;
DIR *dir = opendir(argv[1]);
if (!dir) {
perror("opendir");
return 1;
}
struct dirent *entry;
errno = 0;
while ((entry = readdir(dir)) != NULL) {
printf("%s\n", entry->d_name);
}
if (errno != 0)
perror("readdir");
closedir(dir);
return 0;
}
opendir() 是否成功errno如果你愿意,可以把:
cat /etc/debian_version)发出来,我可以精确帮你定位是哪一条原因。