C语言遍历目录打印文件大小输出顺序错位问题怎么修复
C语言目录遍历打印文件大小问题修复
问题根源
你的输出错位问题主要由几个逻辑错误导致:
- 打印顺序颠倒:拿到文件名后先打印文件名并换行,之后才调用
lstat获取对应文件大小,且大小打印语句没有加换行,导致下一轮循环的文件名直接拼接在上一轮的大小后面,出现大小和文件名匹配错位的问题 - 代码逻辑不完整:仅实现了无参数(默认当前目录)的遍历逻辑,传入自定义目录参数的分支仅执行了
opendir,没有后续遍历输出的处理 - 存在隐藏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
相关产品推荐
相关产品推荐

