From d37c9b627243aa3130c228ba79d04e59cb1bf40d Mon Sep 17 00:00:00 2001 From: Bjoern Esswein <bjoern.esswein@gmail.com> Date: Sun, 16 Feb 2020 18:31:08 +0100 Subject: [PATCH] added filter to scandir --- listFiles.c | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/listFiles.c b/listFiles.c index a75c7f4..8d3684d 100644 --- a/listFiles.c +++ b/listFiles.c @@ -2,18 +2,36 @@ #include <dirent.h> #include <stdio.h> #include <stdlib.h> +#include <sys/stat.h> +#include <string.h> + +#define BASEDIR "." + +int filter(const struct dirent *dir) { + if(dir->d_name[0] == '.') { + return 0;//filter out .files + } + struct stat st; + char name[strlen(BASEDIR) + strlen(dir->d_name)]; + sprintf(name, "%s/%s", BASEDIR, dir->d_name); + if(stat(name, &st) == -1) die("stat");//lstat don't folow symlinks + if(S_ISREG(st.st_mode)) { + return 1; + } + return 0; +} + /** list files */ static void listDir(){ - const char *dirp = "."; struct dirent **namelist; //array of dirents - int n = scandir(dirp, &namelist, NULL, alphasort); + int n = scandir(BASEDIR, &namelist, filter, alphasort);//filter oder NULL if (n == -1) { die("scandir"); } while (n--) { - printf("%s\n", namelist[n]->d_name); + printf("%s/%s\n", BASEDIR, namelist[n]->d_name); free(namelist[n]); } free(namelist); -- GitLab