Опрос и изменение данных о времени, ассоциированных с файлами
Информацию о файле, в том числе данные о времени последнего доступа и изменения, можно получить с помощью описанных ранее функций семейства stat().
Для изменения ассоциированных с файлами данных о времени служит функция utime() (см. листинг 12.25), оперирующая в терминах секунд от начала отсчета.
#include <utime.h> int utime (const char *path, const struct utimbuf *times);
Листинг 12.25. Описание функции utime(). (html, txt)
Если значение аргумента times равно пустому указателю, используется текущее время. В этом случае для успешного изменения данных о времени действующий идентификатор процесса должен соответствовать владельцу файла либо процесс должен иметь права на запись в файл или соответствующие привилегии.
Если значение times отлично от NULL, оно трактуется как указатель на структуру типа utimbuf, которая, согласно стандарту POSIX-2001, содержит по крайней мере следующие поля:
time_t actime; /* Время последнего доступа */
time_t modtime; /* Время последнего изменения */
При этом данные о времени устанавливаются по указуемой структуре, а вызывающий процесс должен обладать соответствующими привилегиями или действующим идентификатором, совпадающим с идентификатором владельца файла (наличия права на запись недостаточно).
В случае успешного завершения функция utime() возвращает нулевой результат и, кроме того, переустанавливает время последнего изменения статуса файла.
Приведем пример программы, изменяющей время последнего доступа к файлу (см. листинг 12.26).
Листинг 12.26. Пример программы, изменяющей время последнего доступа к файлу. (html, txt)
Чтобы изменить только одно из двух ассоциированных с файлом времен, необходимо с помощью функции stat() получить информацию о файле, перенести неизменяемое значение из структуры типа stat в utimbuf, установить требуемым образом второй элемент структуры типа utimbuf и только после этого обратиться к функции utime().
Читателю предлагается убедиться, что приведенная программа работает должным образом и что опция -u служебной программы ls предписывает оперировать со временем последнего доступа вместо времени последнего изменения.
if (argc != 2) { fprintf (stderr, "Использование: %s файл\n", argv [0]); return (1); }
if (stat (argv [1], &st_buf) != 0) { perror ("STAT"); return (2); }
ut_buf.actime = time (NULL); ut_buf.modtime = st_buf.st_mtime;
if (utime (argv [1], &ut_buf) != 0) { perror ("UTIME"); return (3); }
return (0); }
Листинг 12.26. Пример программы, изменяющей время последнего доступа к файлу.
Чтобы изменить только одно из двух ассоциированных с файлом времен, необходимо с помощью функции stat() получить информацию о файле, перенести неизменяемое значение из структуры типа stat в utimbuf, установить требуемым образом второй элемент структуры типа utimbuf и только после этого обратиться к функции utime().
Читателю предлагается убедиться, что приведенная программа работает должным образом и что опция -u служебной программы ls предписывает оперировать со временем последнего доступа вместо времени последнего изменения.