Skip to content

Instantly share code, notes, and snippets.

@binand
Created October 17, 2016 03:02
Show Gist options
  • Save binand/d33446f7317c9e79331ffd9da62b8446 to your computer and use it in GitHub Desktop.
Save binand/d33446f7317c9e79331ffd9da62b8446 to your computer and use it in GitHub Desktop.

Revisions

  1. binand created this gist Oct 17, 2016.
    89 changes: 89 additions & 0 deletions largest.c
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,89 @@
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <ftw.h>

    struct currentry {
    char **path;
    int cnt;
    size_t size;
    };

    struct currentry ce;

    int record_largest(const char *, const struct stat *, int);

    int main(int ac, char **av) {

    int i = 0;

    if (ac < 1) {

    fprintf(stderr, "Usage: largest <directory>\n");
    exit(1);
    }

    ce.cnt = 0;
    ce.size = 0;
    ce.path = NULL;

    ftw(av[1], record_largest, 100);

    if (ce.cnt == 0) {

    printf("No files found?\n");
    exit(1);
    }

    printf("\nLargest file size: %lu\n\n", ce.size);
    for (i = 0; i < ce.cnt; i++) {

    printf("\tFile[%d]: %s\n", i + 1, ce.path[i]);
    }

    putchar('\n');

    exit(0);
    }

    int record_largest(const char *fpath, const struct stat *sb, int typeflag) {

    int i;

    if (typeflag != FTW_F) {
    return 0;
    }

    if (ce.path == NULL) {

    ce.size = sb->st_size;
    ce.cnt = 1;
    ce.path = malloc(sizeof *(ce.path));
    ce.path[0] = malloc(strlen(fpath) + 1);
    strcpy(ce.path[0], fpath);
    return 0;
    }

    if (sb->st_size > ce.size) {

    for (i = 0; i < ce.cnt; i++) {
    free(ce.path[i]);
    }

    free(ce.path);

    ce.size = sb->st_size;
    ce.cnt = 1;
    ce.path = malloc(sizeof *(ce.path));
    ce.path[0] = malloc(strlen(fpath) + 1);
    strcpy(ce.path[0], fpath);

    } else if (sb->st_size == ce.size) {

    ce.path[ce.cnt] = malloc(strlen(fpath) + 1);
    strcpy(ce.path[ce.cnt], fpath);
    ce.cnt++;
    }

    return 0;
    }