在 Debian(以及大多数 Linux 系统)上,readdir 报错通常不是“readdir 本身坏了”,而是使用方式或环境有问题。下面按常见场景给你排查思路和解决办法。
readdir 返回 NULL,errno = ENOENT现象
while ((entry = readdir(dir)) != NULL) { ... }
结束后 errno == ENOENT
原因
readdir 读到目录末尾时返回 NULL,并设置 errno = ENOENT✅ 解决
errno = 0;
while ((entry = readdir(dir)) != NULL) {
// 正常处理
}
if (errno != 0) {
perror("readdir");
}
opendir 成功,但 readdir 段错误(Segmentation fault)原因
DIR* 指针未检查是否为 NULLDIR*✅ 解决
DIR *dir = opendir(path);
if (!dir) {
perror("opendir");
return -1;
}
原因
✅ 解决
locale
如果不是 UTF-8:
sudo dpkg-reconfigure locales
选择 en_US.UTF-8 或 zh_CN.UTF-8
常见错误
ESTALE(文件句柄失效)EIO✅ 解决
sudo umount /mnt/nfs
sudo mount -a
soft 挂载选项(NFS)现象
perror("readdir");
// Permission denied
✅ 解决
ls -ld /path
#include <dirent.h>
#include <errno.h>
#include <stdio.h>
int main() {
DIR *dir = opendir(".");
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;
}
import os
for f in os.listdir('.'):
print(f)
for f in *; do
echo "$f"
done
你可以告诉我:
cat /etc/debian_version)我可以按你的具体场景给代码级解决方案。