Как посчитать файлы в каталоге с помощью C - PullRequest
1 голос
/ 01 июня 2019

Каноническим способом определения типа файла является использование закомментированного код в этом фрагменте:

// Return the number of files in dirName. Ignore directories and links.
#include <sys/types.h>
#include <dirent.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char** argv) {
  int fCt = 0;

  struct dirent *dir;
  DIR *d;
  d = opendir(argv[1]);
  if (d == NULL) {
    printf("%s was not opened!\n", argv[1]);
    exit(0);
  }

  // Count all of the files.
  while ((dir = readdir(d)) != NULL) {
    // struct stat buf;
    // stat(dir->d_name, &buf);
    // if (S_ISREG(buf.st_mode)) { fCt++; }
    if (dir->d_type == 8) { fCt++; }
  }
  return fCt;
}

Элемент buf.st_mode возвращает 41ED (шестнадцатеричное), 16877 (десятичное) как для каталогов, так и для обычных файлов. S_ISREG не может найти правильный бит, установленный для обоих типов.

Обратите внимание, что строка:

    if (dir->d_type == 8) { fCt++; }

возвращает точное количество файлов.

Почему закомментированный метод дал сбой?

1 Ответ

0 голосов
/ 01 июня 2019

Функция 'stat' ожидает получить полный путь к файлу, а не только имя файла относительно каталога.

Если вы используете абсолютный путь к файлу для вызова статистики, S_ISREG (buf.st_mode) возвращает true для обычного файла.

Взгляните на это приятное объяснение здесь: https://stackoverflow.com/a/34168417/2331445

...