在 CentOS(本质就是 Linux)上,用 readdir() 本身是不能直接拿到文件大小的,readdir() 只返回目录项(struct dirent),里面只有文件名和文件类型。
要获取文件大小,常见做法有下面几种:
readdir 拿到文件名后,再用 stat() 或 lstat() 获取文件信息。
#include <stdio.h>
#include <dirent.h>
#include <sys/stat.h>
#include <string.h>
int main() {
DIR *dir = opendir(".");
struct dirent *entry;
struct stat st;
while ((entry = readdir(dir)) != NULL) {
if (stat(entry->d_name, &st) == -1)
continue;
printf("%s size=%ld\n", entry->d_name, st.st_size);
}
closedir(dir);
return 0;
}
st.st_size:文件大小(字节)stat():跟随符号链接lstat():不跟随符号链接(看链接本身大小)避免拼接路径,直接用目录 fd:
#include <fcntl.h>
#include <unistd.h>
#include <dirent.h>
#include <sys/stat.h>
DIR *dir = opendir(".");
int dfd = dirfd(dir);
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
struct stat st;
fstatat(dfd, entry->d_name, &st, 0);
printf("%s size=%ld\n", entry->d_name, st.st_size);
}
在 CentOS 命令行:
ls -l
或递归:
du -sh *
❌ readdir() 里有文件大小
✅ readdir() 只有文件名
❌ dirent.d_off 是文件大小
✅ 那是目录偏移量
如果你是想:
可以告诉我,我可以给你更针对性的方案。