You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言遍历目录打印文件大小输出顺序错位问题怎么修复

C语言目录遍历打印文件大小问题修复

问题根源

你的输出错位问题主要由几个逻辑错误导致:

  1. 打印顺序颠倒:拿到文件名后先打印文件名并换行,之后才调用lstat获取对应文件大小,且大小打印语句没有加换行,导致下一轮循环的文件名直接拼接在上一轮的大小后面,出现大小和文件名匹配错位的问题
  2. 代码逻辑不完整:仅实现了无参数(默认当前目录)的遍历逻辑,传入自定义目录参数的分支仅执行了opendir,没有后续遍历输出的处理
  3. 存在隐藏bug:如果切换到非当前目录遍历,直接传文件名给lstat会找不到文件,必须拼接完整路径

修复后完整代码

#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
#include <stdlib.h>
#include <sys/stat.h>

int main(int argc, char *argv[]){
    struct stat file_stat;
    DIR *dirp;
    struct dirent* dent;
    long total_size = 0;
    char *target_dir = ".";

    // 统一处理目录入参
    if(argc > 1){
        target_dir = argv[1];
    }
    dirp = opendir(target_dir);
    if(dirp == NULL){
        perror("打开目录失败");
        return 1;
    }

    printf("dir %s\n", target_dir);
    // 遍历目录项
    while((dent = readdir(dirp)) != NULL){
        // 跳过.开头的隐藏文件
        if(dent->d_name[0] == '.'){
            continue;
        }
        // 拼接完整路径避免非当前目录下lstat失败
        char full_path[1024];
        snprintf(full_path, sizeof(full_path), "%s/%s", target_dir, dent->d_name);
        if(lstat(full_path, &file_stat) == 0){
            // 调整打印顺序,同一行输出大小+文件名,%8ld右对齐格式更整齐
            printf("%8ld:%s\n", (long)file_stat.st_size, dent->d_name);
            total_size += (long)file_stat.st_size;
        }
    }

    printf("\n\nTotal file space used:%ld\n", total_size);
    closedir(dirp);
    return 0;
}

核心改动说明

  • 调整了打印顺序,先获取文件大小,再同批次输出大小和文件名,每行单独换行,彻底解决错位问题
  • 补全了自定义目录传入的处理逻辑,支持任意指定目录遍历
  • 增加了路径拼接逻辑,兼容非当前目录的遍历场景
  • 用%8ld格式化输出大小,右对齐和你期望的输出格式完全匹配

内容的提问来源于stack exchange,提问作者Derek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.15 02:24:06