(Тест '
!strcmp(s1, s2)strcmp(s1, s2) == 0!strcmp(s1, s2)strcmp()Когда 4.2 BSD представило новый формат файловой системы, который допускал длинные имена файлов и обеспечивал лучшую производительность, были также представлены несколько новых функций для абстрагирования чтения каталогов. Этот набор функций можно использовать независимо от того, какова лежащая в основе файловая система и как организованы каталоги. Основная ее часть стандартизована POSIX, а программы, использующие ее, переносимы между системами GNU/Linux и Unix.
5.3.1. Базовое чтение каталогов
Элементы каталогов представлены
struct direntstruct directstruct dirent { ... ino_t d_ino; /* расширение XSI --- см. текст */ char d_name[...]; /* О размере этого массива см. в тексте */ ...};Для переносимости POSIX указывает лишь поле
d_named_nameNAME_MAXNAME_MAX<limits.h>d_inoНа практике, поскольку имена файлов могут быть различной длины, a
NAME_MAXstruct direntСледующие функции предоставляют интерфейс чтения каталогов:
#include <sys/types.h> /* POSIX */#include <dirent.h>DIR *opendir(const char *name); /* Открыть каталог для чтения */struct dirent *readdir(DIR *dir); /* Вернуть struct dirent за раз */int closedir(DIR *dir); /* Закрыть открытый каталог */void rewinddir(DIR *dirp); /* Вернуться в начало каталога */Тип
DIRFILE<stdio.h>opendir()NULLОткрыв переменную
DIR*struct direntreaddir()NULLНаконец,
closedir()fclose()<stdio.h>DIR*rewinddir()Имея в распоряжении (или по крайней мере в библиотеке С) эти функции, мы можем написать небольшую программу
catdirch05-catdir.с1 /* ch05-catdir.с - Демонстрация opendir(), readdir(), closedir(). */23 #include <stdio.h> /* для printf() и т.д. */4 #include <errno.h> /* для errno */5 #include <sys/types.h> /* для системных типов */6 #include <dirent.h> /* для функций каталога */78 char *myname;9 int process(char *dir);1011 /* main --- перечисление аргументов каталога */1213 int main(int argc, char **argv)14 {15 int i;16 int errs = 0;1718 myname = argv[0];1920 if (argc == 1)21 errs = process("."); /* по умолчанию текущий каталог */22 else23 for (i = 1; i < argc; i++)24 errs += process(argv[i]);2526 return (errs != 0);27 }Эта программа вполне подобна
ch04-cat.cmain()29 /*30 * process --- сделать что-то с каталогом, в данном случае,31 * вывести пары индекс/имя в стандартный вывод.32 * Возвращает 0, если все OK, иначе 1.33 */3435 int36 process(char *dir)37 {