Как программа может запомнить время своего последнего запуска?

Я делаю простую программу, которая копирует файлы, созданные или измененные с момента последнего запуска. Как лучше всего сохранить время последнего запуска самой программы? Я думал, что у него может быть текстовый файл, в котором он будет хранить дату и время, но есть ли способ, который не требует внешних файлов? В Windows есть дата «последнего изменения», но я не знаю дату «последнего использования».


person Celeritas    schedule 24.08.2012    source источник
comment
Обычный способ — либо создать запись реестра, в которой хранится информация для вашего приложения (в HKEY_CURRENT_USER, поскольку время последнего запуска может различаться у разных пользователей), либо в файле в пользовательской папке %APPDATA%.   -  person Ken White    schedule 24.08.2012
comment
Если бы я сохранил его в файле, было бы более эффективно только произвольно изменять файл и проверять дату последнего изменения файлов, а не чтение и запись строки, содержащей время последнего запуска программы?   -  person Celeritas    schedule 24.08.2012
comment
По сравнению с остальной частью вашей программы количество времени, которое вы тратите на открытие, запись метки времени и закрытие файла, ничтожно мало. Напишите что-нибудь удобочитаемое для человека, а также для машины.   -  person sizzzzlerz    schedule 24.08.2012
comment
@Celeritas Что вас беспокоит по поводу производительности простого сравнения дат. Также обратите внимание, что лучше декодировать/кодировать строку, чем работать с ней напрямую.   -  person Sebastian Hoffmann    schedule 24.08.2012
comment
Вы хотите произвольно изменить какой файл? Сам текстовый файл? Установить отметку последнего изменения файла сложнее, чем сохранить файл с датой, и никто ничего не говорил о строке, содержащей время. Двоичные файлы работают довольно легко и занимают меньше места для хранения тех же данных.   -  person Ken White    schedule 24.08.2012
comment
Есть отметка времени последнего доступа, но ее можно отключить (чтобы не обновлялась). Я не уверен, включен ли он по умолчанию для исполняемых файлов. В моей Windows 7 это не обновляется, но я думаю, что, может быть, я отключил эту штуку.   -  person Cheers and hth. - Alf    schedule 24.08.2012
comment
Это то, что я имею в виду. Вариант 1) Завести текстовый файл и в нем написать время выполнения программы. Любые файлы старше предыдущей записи будут скопированы. Вариант 2) Произвольно изменить текстовый файл так, чтобы дата его последнего изменения соответствовала времени последнего запуска программы. Вроде вариант 1 лучше   -  person Celeritas    schedule 24.08.2012


Ответы (2)


Я думаю, что любой метод требует файла или модифицированного файла, включая метод реестра, предложенный в комментариях. Хотя технически это файл, возможность альтернативного потока данных файловых систем NT является одним из методов. Вот хорошее описание. http://www.bleepingcomputer.com/tutorials/windows-alternate-data-streams/

person kenny    schedule 24.08.2012
comment
Итак, ваше предложение состоит в том, чтобы хранить альтернативный поток данных для самого исполняемого файла? Это не только больше работы, но и потребует нескольких записей (по одной для каждой учетной записи пользователя) и дополнительной информации (какой пользователь запускал ее последним). Я не думаю, что это жизнеспособный вариант для заданного вопроса. (Не отрицаю, но полностью не согласен со стратегией.) - person Ken White; 24.08.2012
comment
@KenWhite Petty легко иметь один поток для каждого пользователя с одной последней датой выполнения, но я не думаю, что это хороший способ решить проблему, но это способ. Практически в любом случае потребуется какой-то файл и, как вы предлагаете, запись для каждого пользователя. - person kenny; 24.08.2012
comment
Это только кажется, что это слишком сложное решение для заданного вопроса. Что делать, если у пользователя нет прав на запись в исполняемый файл? Если вопрос так же прост, как сохранить последний файл, который запускал приложение, кажется, что быстрая запись файла в локальную папку или папку перемещаемого профиля локального пользователя была бы намного лучше (тем более, что автор даже не знал, как выполнить задачу вообще). - person Ken White; 24.08.2012
comment
@KenWhite хорошие моменты в области безопасности. Я не понимаю вашей сложной вещи. Я могу писать в альтернативный поток из командной строки, и это так же просто, как запись любого файла. - person kenny; 24.08.2012
comment
:-) Я знаю. Сложность возникает из-за прикрепления нескольких альтернативных потоков к одному и тому же файлу, что означает, что теперь вам нужно как-то идентифицировать их с текущим пользователем (APPDATA это уже знает), есть проблемы с копированием файла (сопутствуют ли альтернативные потоки или вы оставь их и начни сначала). Я говорил не о сложности написания самих потоков, а о другой сложности. - person Ken White; 24.08.2012
comment
Хорошо, я понимаю, о чем вы говорите, но это «это зависит». Я могу видеть сценарии, в которых у вас есть одно и то же приложение в разных местах, которое вы хотите отслеживать «при последнем запуске». В этот момент подход репозитория APPDATA становится слишком сложным. Хорошие моменты во всем и во всем, и предоставление информации OP - это неплохо. - person kenny; 24.08.2012

Я делаю простую программу, которая копирует файлы, созданные или измененные с момента последнего запуска.

Для этого используется флаг архива. Windows будет автоматически устанавливать этот флаг всякий раз, когда файл создается или изменяется.

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

person Branko Dimitrijevic    schedule 24.08.2012
comment
Если вы сбросите его, обычные резервные копии не обнаружат изменения и не создадут их резервную копию (особенно при добавочном резервном копировании). - person Ken White; 24.08.2012
comment
@KenWhite Я не думаю, что обычная резервная копия Windows больше использует этот флаг. Все неизмененные файлы, резервные копии которых создаются на моей машине, похоже, имеют установленный бит архива. Конечно, могут быть и другие программы резервного копирования, которые все еще используют этот флаг... - person Branko Dimitrijevic; 24.08.2012
comment
Резервное копирование Windows? Кто-нибудь реально этим пользуется? ;-) Я не голосую против, но это также не обрабатывает ситуацию для каждого пользователя (и требует доступа на запись ко всем задействованным файлам, чтобы перевернуть бит архива - кто-нибудь UAC?). - person Ken White; 24.08.2012