C - игнорировать имена подкаталогов и печатать только имена файлов
С помощью этого кода я могу рекурсивно печатать все файлы и подкаталоги по заданному пути.
Я хочу игнорировать (не печатать) все имена подкаталогов и печатать только имена файлов.
Это код:
#include <stdio.h>
#include <dirent.h>
#include <string.h>
void listFilesRecursively(char *basePath)
{
char path[1000];
struct dirent *dp;
DIR *dir = opendir(basePath);
if (!dir)
return;
while ((dp = readdir(dir)) != NULL)
{
if (strcmp(dp->d_name, ".") != 0 && strcmp(dp->d_name, "..") != 0)
{
strcpy(path, basePath);
strcat(path, "/");
strcat(path, dp->d_name);
listFilesRecursively(path);
printf("%s\n", path);
}
}
closedir(dir);
}
int main()
{
char path[100];
printf("Enter path to list files: ");
scanf("%s", path);
listFilesRecursively(path);
return 0;
}
1 ответ
Есть макросы, которые говорят вам, что это за тип файла:
S_ISREG()
: обычный файлS_ISDIR()
: файл каталогаS_ISCHR()
: специальный символьный файлS_ISBLK()
: заблокировать специальный файлS_ISFIFO()
: труба или FIFO -S_ISLNK()
: символическийS_ISSOCK()
: ссылка сокет
Прежде всего вы можете использовать одну из следующих функций для получения информации:
#include <sys/stat.h>
int stat(const char *restrict pathname, struct stat *restrict buf );
int fstat(int fd, struct stat *buf);
int lstat(const char *restrict pathname, struct stat *restrict buf );
int fstatat(int fd, const char *restrict pathname, struct stat *restrict buf, int flag);
Из книги "Расширенное программирование в среде Unix":
По заданному пути функция stat возвращает структуру информации об указанном файле. Функция fstat получает информацию о файле, который уже открыт по дескриптору fd. Функция lstat похожа на stat, но когда именованный файл является символической ссылкой, lstat возвращает информацию о символической ссылке, а не о файле, на который ссылается символическая ссылка.
Вы можете попробовать что-то вроде следующего:
struct stat statbuf;
struct dirent *dirp;
DIR *dp;
int ret, n;
/* fullpath contains full pathname for every file */
if (lstat(fullpath, &statbuf) < 0)
{
printf("error\n");
//return if you want
}
if (S_ISDIR(statbuf.st_mode) == 0)
{
/* not a directory */
}
else
{
//a directory
}
Исторически ранние версии системы UNIX не обеспечивали S_ISxxx
макросы. Вместо этого нам пришлось логически AND
st_mode
значение с маской S_IFMT
а затем сравнить результат с константами, чьи имена S_IFxxx
, Большинство систем определяют эту маску и связанные с ней константы в файле.
Например:
struct stat *statptr;
if (lstat(fullpath, statptr) < 0)
{
printf("error\n");
//return if you want
}
switch (statptr->st_mode & S_IFMT) {
case S_IFREG: ...
case S_IFBLK: ...
case S_IFCHR: ...
case S_IFIFO: ...
case S_IFLNK: ...
case S_IFSOCK: ...
case S_IFDIR: ...
}