如何用ftw获取目录中10个最大文件?代码出现重复文件问题求助
问题分析与修复方案
先拆解你代码里的核心问题:
1. 全局变量i导致循环彻底失效
你把i定义成了全局变量,第一次处理文件时,for(i; i<10; i++)会把i从0循环到9,之后i的值固定为10。后续处理其他文件时,循环条件i<10永远不成立,数组完全不会更新。
解决:把i改成循环内的局部变量,每次循环都从0开始。
2. 数组未初始化导致判断逻辑混乱
全局数组array_file声明后没有初始化,size字段是随机垃圾值。第一个文件进来时,大概率比所有随机值都大,循环会把10个元素全替换成第一个文件——这就是你看到所有元素都是同一个文件的直接原因。
解决:在主函数里初始化数组,把size设为0,path清空。
3. 替换逻辑错误
你当前的逻辑是「只要当前文件比数组里某个元素大就替换」,这会导致多个元素被替换成同一个文件,根本没法维护「最大的10个文件」。正确的逻辑应该是:数组填满后,找到数组里最小的元素,如果当前文件比它大,就替换这个最小元素,这样数组始终保留已找到的最大10个文件。
修正后的完整代码
#include <stdio.h> #include <ftw.h> #include <string.h> typedef struct File{ char path[1000]; long size; }File; File array_file[10]; int compt = 0; // 找到数组中size最小的元素索引 int find_smallest_index() { int idx = 0; for (int i = 1; i < 10; i++) { if (array_file[i].size < array_file[idx].size) { idx = i; } } return idx; } int fn(const char *fpath, const struct stat *sb, int typeflag){ switch (typeflag) { case FTW_F: // 数组未填满时直接添加 if(compt < 10){ strncpy(array_file[compt].path, fpath, sizeof(array_file[compt].path)-1); array_file[compt].path[sizeof(array_file[compt].path)-1] = '\0'; // 确保字符串终止,防止溢出 array_file[compt].size = sb->st_size; compt += 1; } else { // 数组已满,替换最小的元素 int smallest_idx = find_smallest_index(); if (sb->st_size > array_file[smallest_idx].size) { strncpy(array_file[smallest_idx].path, fpath, sizeof(array_file[smallest_idx].path)-1); array_file[smallest_idx].path[sizeof(array_file[smallest_idx].path)-1] = '\0'; array_file[smallest_idx].size = sb->st_size; } } break; case FTW_D: break; case FTW_DNR: return -1; case FTW_NS: return -1; } return 0; } int main(int argc, char const *argv[]) { // 初始化数组,避免垃圾值干扰 for (int i = 0; i < 10; i++) { array_file[i].size = 0; array_file[i].path[0] = '\0'; } if(argc > 1){ ftw(argv[1], fn, 20); } // 输出结果,只显示有实际数据的元素 printf("找到的最大10个文件:\n"); for(int i = 0; i < 10; i++){ if (array_file[i].size > 0) { printf("路径:%s\n大小:%ld字节\n\n", array_file[i].path, array_file[i].size); } } return 0; }
额外优化说明
- 用
strncpy代替strcpy,避免路径过长导致缓冲区溢出,手动添加字符串终止符保证安全。 - 新增
find_smallest_index函数,把找最小元素的逻辑抽离,代码更清晰。 - 输出时过滤掉未填充的元素(如果目录下文件不足10个)。
内容的提问来源于stack exchange,提问作者Sid-Ali
相关产品推荐
相关产品推荐

