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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 14:20:34