Книга: Разработка приложений в среде Linux. Второе издание

11.3.2. Простой пример stat()

11.3.2. Простой пример stat()

Рассмотрим простую программу, которая отображает информацию из lstat() для каждого имени файла, переданного в аргументе. Она иллюстрирует, как использовать значения, возвращенные семейством функций stat().

 1: /* statsamp.с */
 2:
 3: /* Для каждого имени файла, переданного в командной строке, отображаем
 4:    всю информацию, которую возвращает lstat() для файла. */
 5:
 6: #include <errno.h>
 7: #include <stdio.h>
 8: #include <string.h>
 9: #include <sys/stat.h>
10: #include <sys/sysmacros.h>
11: #include <sys/types.h>
12: #include <time.h>
13: #include <unistd.h>
14:
15: #define TIME_STRING_BUF 50
16:
17: /* Пользователь передает buf (минимальной длины TIME_STRING_BUF) вместо
18:    использования статического для функции буфера, чтобы избежать применения
19:    локальных статических переменных и динамической памяти. Никаких ошибок
20:    происходить не должно, поэтому никакой проверки ошибок не делаем. */
21: char *time String (time_t t, char *buf) {
22:  struct tm *local;
23:
24:  local = localtime(&t);
25:  strftime(buf, TIME_STRING_BUF, "%c", local);
26:
27:  return buf;
28: }
29:
30: /* Отобразить всю информацию, полученную от lstat() по имени
31:    файла как единственному параметру. */
32: int statFile(const char *file) {
33:  struct stat statbuf;
34:  char timeBuf[TIME_STRING_BUF];
35:
36:  if (lstat(file, &statbuf)) {
37:   fprintf(stderr, "не удалось lstat %s: %sn", file,
38:    strerror(errno));
39:   return 1;
40:  }
41:
42:  printf("Имя файла : %sn", file);
43:  printf("На устройстве: старший %d/младший %d Inode номер: %ldn" ,
44:   major(statbuf.st_dev), minor(statbuf.st_dev),
45:   statbuf.st_ino);
46:  printf ("Размер : %-101d Тип: %07o"
47:   "Права доступа : %05on", statbuf.st_size,
48:   statbuf.st_mode & S_IFMT, statbuf.st_mode &~(S_IFMT));
49:  printf("Владелец : %d Группа : %d"
50:   " Количество ссылок : %dn",
51:   statbuf.st_uid, statbuf.st_gid, statbuf.st_nlink);
52:  printf("Время создания : %sn",
53:   timeString(statbuf.st_ctime, timeBuf));
54:  printf("Время модификации : %sn",
55:   timeString(statbuf.st_mtime, timeBuf));
56:  printf("Время доступа : %sn",
57:   timeString (statbuf.st_atime, timeBuf));
58:
59:  return 0;
60: }
61:
62: int main(int argc, const char **argv) {
63:  int i;
64:  int rc = 0 ;
65:
66:  /* Вызвать statFile() для каждого имени файла,
67:     переданного в командной строке. */
68:  for (i = 1; i < argc; i++) {
69:   /* Если statFile() сбоит, rc будет содержать не ноль.*/
70:   rc |= statFile(argv[i]);
71:
72:   /* это печатает пробел между позициями,
73:      но не за последней */
74:   if ((argc - i) > 1) printf ("n");
75:  }
76:
77:  return rc;
78: }

Оглавление книги


Генерация: 0.890. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз