Как определить, какие записи являются файлами, а какие каталогами в C - PullRequest
0 голосов
/ 03 апреля 2020

У меня есть программа C в Linux, которая собирает записи каталога (типа struct dirent * ') из структуры DIR и отображает их. Теперь моя цель - рекурсивно пройти через файловую систему, поэтому мне нужно идентифицировать каталогов и файлов отдельно.

DIR* cwd = opendir(".");
struct dirent* directoryEntry = NULL;
while((directoryEntry = readdir(cwd)) != NULL) {
    printf("%s ", directoryEntry->d_name);
}
closedir(cwd);

Я знаю, вы могли бы сказать, что мы может идентифицировать файлы, если в конце есть расширение «.mp4» или «.txt». Но файлы без какого-либо расширения также могут существовать.

Существует ли какой-либо атрибут struct dirent *, который указывает, является ли это файл или каталог?

1 Ответ

1 голос
/ 03 апреля 2020

Вы можете попробовать это:

   struct dirent {
       ino_t          d_ino;       /* Inode number */
       off_t          d_off;       /* Not an offset; see below */
       unsigned short d_reclen;    /* Length of this record */
       unsigned char  d_type;      /* Type of file; not supported
                                      by all filesystem types */
       char           d_name[256]; /* Null-terminated filename */
   };

И как только он у вас появится, проверьте, содержит ли d_type DT_DIR:

  DT_BLK      This is a block device.
  DT_CHR      This is a character device.
  DT_DIR      This is a directory.           <<---- this one!!!
  DT_FIFO     This is a named pipe (FIFO).
  DT_LNK      This is a symbolic link.
  DT_REG      This is a regular file.
  DT_SOCK     This is a UNIX domain socket.
  DT_UNKNOWN  The file type could not be determined.

По дополнительным вопросам обращайтесь до http://man7.org/linux/man-pages/man3/readdir.3.html

...