[<<Previous Entry] [^^Up^^] [Next Entry>>] [Menu] [About The Guide]
 Просмотр содержимого директории - Пример

Программа на следующей странице показывает, как читать записи из файла
директории. Кроме того, выдается размер обычных файлов в директории.
Это упрощенная версия команды ls(1). Программа работает так:
10   Объявление указателя на DIR.
11   Объявление указателя на запись в директории
   14     Файл директории, имя которого передается как первый аргумент
          в командной  строке,  открывается  для  чтения.  opendir(3C)
          возвращает указатель  на  DIR.  Если  аргумент  не  является
          директорией, opendir(3C) возвращает неуспех.

18   Считывается очередная запись. Этот цикл завершается, когда
достигнут конец директории.
20-23     Программа получает информацию о состоянии файла.
24-26     Если файл является обычным файлом, распечатывается его имя и
размер. Поле d_relen содержит длину имени. stbuf.st_size содержит
размер файла.
27-28     Если файл не является обычным файлом, распечатывается только
имя.
30   Директория закрывается.
Пример демонстрируется так:
$ dir1 tmp
.
..
junk
unit02.mm       16867
unit03.mm       32138
unit08.mm       25721
unit14.mm       29653
unit16.mm       16015

Файл: dir1.c
              РАСПЕЧАТКА СОДЕРЖИМОГО ДИРЕКТОРИИ - ПРИМЕР

 1 #include <sys/types.h>
 2 #include <unistd.h>
 3 #include <stdlib.h>
 4 #include <stdio.h>
 5 #include <dirent.h>
 6 #include <sys/stat.h>
 7
 8 main(int argc, char *argv[])
 9 {
10      DIR *dirp;
11      struct dirent *dp;
12      struct stat stbuf;
13
14      if ((dirp = opendir(argv[1])) == NULL) {
15       perror(argv[1]);
16       exit(1);
17      }
18      while ((dp = readdir(dirp)) != NULL)
19       {
20       if (stat(dp->d_name, &stbuf) == -1) {
21            perror(dp->d_name);
22            break;
23       }
24       if ((stbuf.st_mode & S_IFMT) == S_IFREG)
25            printf("%-14.*s  %ld\n", dp->d_reclen, dp->d_name,
26             stbuf.st_size);
27       else
28            printf("%-14.*s\n", dp->d_reclen, dp->d_name);
29      }
30      closedir(dirp);
31      return(0);
32 }