Как определить, когда файл обновляется в C ++? - PullRequest
1 голос
/ 27 июля 2011

Я использую приложение, которое принимает Файл X в качестве входных данных и дает Файл Y и Z в качестве выходных данных (графики и графики)
Теперь, если приложение запускается снова:

  1. Файл Y иZ уже существует, и файл X не обновляется, поэтому его не следует перезаписывать.
  2. Файл X обновляется, затем файлы Y и Z должны быть перезаписаны.

Коднаписанный на c ++, как я могу изменить код так, чтобы оба условия были выполнены?Должен ли я взять отметку времени X каждый раз?

Ответы [ 7 ]

2 голосов
/ 27 июля 2011

Если вы работаете с POSIX, используйте stat или связанную функцию, такую ​​как fstat. Эквиваленты окон описаны в http://msdn.microsoft.com/en-us/library/14h5k7ff(v=vs.80).aspx.

Структура, возвращаемая stat или аналогами окон, имеет поле, представляющее время последнего изменения файла.

1 голос
/ 27 июля 2011

Для портативного решения Boost.Filesystem имеет last_write_time , который возвращает время последней модификации как std::time_t.

0 голосов
/ 08 марта 2019

Обратите внимание, что при проверке времени последнего обновления существуют некоторые ограничения :

... Разрешение [время] в некоторых файловых системах составляет всего один час ... Во время выполнения программы системные часы могут быть установлены на новое значение другим, возможно автоматическим, процессом ...

0 голосов
/ 27 июля 2011

Другая возможность: написать базовую программу с X, всегда перезаписывая Y и Z. Вызвать базовую программу с помощью make.Makefile, который выглядит как:

Y Z : X
    basicProgram X Y Z

, должен сделать свое дело.Затем вы можете вызвать его с помощью команды «make Y» или «make Z». Нижняя строка: пусть беспокоятся о временных метках и прочем.

0 голосов
/ 27 июля 2011

используя ответ Дэвида Хаммена, сравните метку времени изменения X с Y и Z, если X был изменен позже, чем Y или Z - так что они устарели и должны быть переписаны

0 голосов
/ 27 июля 2011

Да, вы должны проверить файл X и увидеть (два варианта):

  • если дата его обновления изменилась или
  • или если его содержимое изменилось (на примере CRC32).

Первый самый простой и быстрый. Второй самый точный.
ИЗМЕНИТЬ дальше к комментариям ниже: Эти два варианта могут быть объединены для достижения компромисса.

0 голосов
/ 27 июля 2011

Вы можете просто сохранить хэш файла X. Если он изменился, файл был изменен (обновлен), и вам нужно будет обновить Y и Z.

if (XHashPrev != XHashNow || !YZExist)
    // update files.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...