[<<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 }