readdir 在 Debian(或任何 Linux)上“失败”通常不是 Debian 本身的问题,而是参数、权限、文件系统状态或程序用法的问题。下面按最常见原因 → 排查方法 → 示例来说明。
readdir?readdir()(最常见)#include <dirent.h>
DIR *dir = opendir(path);
struct dirent *entry = readdir(dir);
ls
例如:
readdir: Permission deniedreaddir: No such file or directoryreaddir: Input/output errorls /some/nonexistent
✅ 排查:
ls -ld /path/to/dir
readdir: Permission denied
✅ 排查:
ls -ld /path
✅ 解决:
chmod +x /path
# 或
sudo ls /path
⚠️ 注意:
x 权限r 权限是不够的opendir() 失败,但你没检查错误示例:
DIR *dir = opendir(path);
readdir(dir); // dir 可能是 NULL
✅ 正确写法:
DIR *dir = opendir(path);
if (!dir) {
perror("opendir");
return 1;
}
常见于:
错误:
Input/output error
✅ 排查:
mount | grep path
df -h
dmesg | tail
✅ 修复(谨慎):
fsck /dev/sdX
大目录(几十万文件)可能:
readdir 很慢✅ 排查:
ls | wc -l
❌ 错误:
readdir(&dir);
✅ 正确:
readdir(dir);
#include <stdio.h>
#include <dirent.h>
int main(int argc, char *argv[]) {
if (argc < 2) {
printf("Usage: %s <dir>\n", argv[0]);
return 1;
}
DIR *dir = opendir(argv[1]);
if (!dir) {
perror("opendir");
return 1;
}
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
printf("%s\n", entry->d_name);
}
closedir(dir);
return 0;
}
编译:
gcc test.c -o test
./test /tmp
| 检查项 | 命令 |
|---|---|
| 目录是否存在 | ls -ld /path |
| 权限是否足够 | ls -ld /path |
| 是否 NFS | mount |
| 是否磁盘错误 | dmesg |
| 程序是否检查 NULL | 看代码 |
你可以直接贴出:
我可以精确告诉你 为什么 readdir 失败 ✅