Giovanni's Diary > Subjects > Programming > Gists >
C / traverse_dir.c
Traverse a directory recursively and call handle_file on each file, optinoally specifying how many levels deep to go.
// SPDX-License-Identifier: MIT // Author: Giovanni Santini // Mail: giovanni.santini@proton.me // Github: @San7o #include <stdio.h> #include <fts.h> int handle_file(char* filename) { printf("Handling file %s\n", filename); return 0; } // Traverse [dir] recursively two levels deep and call handle_file on each file int traverse_dir(char *dir) { int err = 0; char *path_argv[] = { dir, NULL }; FTSENT *file_entry = NULL; FTS *files = fts_open(path_argv, FTS_PHYSICAL | FTS_NOCHDIR, NULL); if (!files) return -1; while ((file_entry = fts_read(files))) { switch (file_entry->fts_info) { case FTS_D: // Directory if (file_entry->fts_level == 0) { //Top-level directory itself, continue continue; } else { // Skip descending into subdirectories //fts_set(files, file_entry, FTS_SKIP); } break; case FTS_F: // Regular file case FTS_SL: // Symbolic link case FTS_DEFAULT: if (file_entry->fts_level <= 2) // Go only two levels deep { err = handle_file(file_entry->fts_path); if (err != 0) { goto exit; } } break; default: break; } } exit: if (fts_close(files) < 0 && err == 0) return -2; return err; }