在 Debian(或任何 Linux)系统上,readdir() 返回“空”通常不是函数本身的问题,而是使用方式或环境导致的。下面按常见原因逐一说明。
readdir() 本身的行为(先澄清概念)readdir() 永远不会“返回空目录”,它的语义是:
struct dirent *NULLNULL,并设置 errno所以你说的“返回空”通常是以下之一:
readdir() 返回 NULL(目录为空或读到结尾)dirent->d_name 看起来是空字符串ls -a /path/to/dir
如果只有 . 和 ..,那 readdir() 返回 NULL 是正常的。
readdir()错误示例:
DIR *dir;
readdir(dir); // ❌ dir 未初始化
正确方式:
DIR *dir = opendir("/some/path");
if (!dir) {
perror("opendir");
return;
}
opendir() 失败但没检查 errnoDIR *dir = opendir("/root");
if (!dir) {
// 普通用户读 /root 会失败
perror("opendir");
}
在 Debian 上常见权限问题:
/root/proc/*readdir() 只调用了一次struct dirent *entry = readdir(dir);
printf("%s\n", entry->d_name);
如果目录第一项被跳过或逻辑错误,看起来像“空的”。
正确循环:
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
printf("%s\n", entry->d_name);
}
例如:
opendir("/mnt/usb");
但 U 盘没插:
opendir() 成功检查:
mount | grep /mnt
在:
目录下内容可能和你预期不同。
NULL 当成“空文件名”if (entry == NULL) {
printf("empty\n"); // ❌ 实际是读到结尾
}
#include <stdio.h>
#include <dirent.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;
while ((entry = readdir(dir)) != NULL) {
printf("%s\n", entry->d_name);
}
closedir(dir);
return 0;
}
编译运行:
gcc readdir_test.c -o readdir_test
./readdir_test /tmp
strace ./your_program /path
ls -ld /path
id
如果你愿意,可以把:
发出来,我可以直接帮你定位是哪一条原因。