Поскольку вы используете ручки с крышками для fopen()
и fclose()
, вы можете записать результат fstat()
при открытии файла и еще раз, когда вы собираетесь закрыть файл, и сравнитьдва.Если что-то изменилось, то вы получили положительное изменение и вам нужно пересчитать хэш.Если ничего не изменилось, вы можете быть умеренно уверены, что у вас есть тот же файл, что и раньше.Если вам необходимо устранить эту неопределенность, то вам все равно придется заново вычислять хеш, зная, что файл может быть изменен другим потоком или другим процессом во время вычисления хеша.
Обратите внимание, что современный POSIX ( POSIX 2008 ) предоставляет struct stat
элементы времени:
struct timespec st_atim
- метка времени последнего доступа к данным. struct timespec st_mtim
- метка времени последнего изменения данных. struct timespec st_ctim
- Отметка времени последнего изменения статуса файла.
Они обеспечивают наносекундное разрешение для времени модификации.Вполне вероятно, что по причинам обратной совместимости существуют такие макросы, как:
#define st_atime st_atim.tv_sec
#define st_mtime st_mtim.tv_sec
#define st_ctime st_ctim.tv_sec
, хотя AFAICS, стандарт POSIX, не требует этого.Однако имена st_Xtime
использовались с начала (Unix) времени - Версия 7 Unix с 1978 года и, возможно, раньше - поэтому системы захотят сохранить компиляцию старого кода, а макросы, подобные тем, которые обеспечивают умеренно безболезненный способделать это.