Как получить readdir игнорировать каталоги в C / C ++? - PullRequest
1 голос
/ 17 апреля 2010

Я читаю содержимое текущей библиотеки с помощью readdir, но я хотел бы обработать только файлы, а не каталоги. Как мне узнать, что я указываю на каталог, а не на файл?

Спасибо

Ответы [ 2 ]

1 голос
/ 17 апреля 2010

Вы можете использовать lstat и макрос S_ISDIR .

например. без проверки ошибок:

struct stat buffer;
int status;
char path[PATH_MAX];
DIR *dir = opendir(dir_name);
... 
struct dirent *de = readdir(dir);
sprintf(path, "%s/%s", dir_name, de->d_name);
status = lstat(path, &buffer);
if(S_ISDIR(buffer.st_mode))
{
   ...
}

EDIT: исправлено включение каталога в путь lstat (для el.pescado). Как отметил R Samuel Klatchko, вы можете захотеть использовать подход белого списка (S_ISREG) вместо того, чтобы заносить в черный список типы по мере их появления.

0 голосов
/ 18 ноября 2016
`void DirectryNFileCount(const char * FileDir)
 {
  DIR *dir;
  int filecount;
  int dircount;
  struct dirent *direntry;
  if ((dir = opendir (FileDir)) == NULL) 
  {
   /*Error code*/
   } 
 while((direntry = readdir (dir)) != NULL)
 {
 if(direntry->d_type==DT_DIR)
 dircount++;
/*do something with directries      */
 }
 else 
 {
  filecount++;
  std::cout<<"Files Names"<<direntry->d_name<<std::endl; 
 }
 }
  std::cout<<"THIS Directory has "<<filecount<<" FILES and "<<dircount<< " DIRECTORIES";
}
...