温馨提示×

debian readdir怎样获取文件大小

小樊
39
2026-09-01 10:32:21
栏目: 智能运维

在 Debian(以及所有 Linux 系统)下,readdir() 本身并不能直接获取文件大小readdir() 只返回目录项(struct dirent),其中包含:

  • 文件名 d_name
  • 文件类型(部分系统支持,如 DT_REGDT_DIR
  • inode 号(可选)

文件大小需要通过 stat() / lstat() 获取。


正确做法:readdir + stat

示例(C 语言)

#include <stdio.h>
#include <dirent.h>
#include <sys/stat.h>
#include <string.h>

int main(int argc, char *argv[]) {
    const char *path = ".";
    DIR *dir = opendir(path);
    if (!dir) {
        perror("opendir");
        return 1;
    }

    struct dirent *entry;
    while ((entry = readdir(dir)) != NULL) {
        // 跳过 . 和 ..
        if (strcmp(entry->d_name, ".") == 0 ||
            strcmp(entry->d_name, "..") == 0)
            continue;

        char fullpath[1024];
        snprintf(fullpath, sizeof(fullpath), "%s/%s", path, entry->d_name);

        struct stat st;
        if (stat(fullpath, &st) == -1) {
            perror("stat");
            continue;
        }

        printf("%s: %ld bytes\n", entry->d_name, st.st_size);
    }

    closedir(dir);
    return 0;
}

关键点说明

1. readdir() 不提供大小

struct dirent {
    ino_t          d_ino;
    off_t          d_off;
    unsigned short d_rendtl;
    unsigned char  d_type;   // 文件类型,不是大小
    char           d_name[]; // 文件名
};

2. 使用 stat() 获取大小

st.st_size   // 普通文件大小(字节)
st.st_blocks // 占用磁盘块数

3. 符号链接用 lstat()

如果不想跟随符号链接:

lstat(fullpath, &st);

性能优化(可选)

如果你只需要文件名和大小,且目录很大:

  • 使用 getdents()(底层系统调用)
  • fts* / nftw()
  • 或在 shell 中直接用:
    ls -l
    stat *
    du -h
    

总结

Debian 下获取文件大小的标准方式:

readdir() 拿到文件名 → stat() 获取 st_size

如果你需要 某一语言版本(C++ / Python / Shell)递归目录示例,可以继续问我。

0