【问题标题】:How can a program remember the time it was last run?程序如何记住上次运行的时间?
【发布时间】:2012-08-24 00:15:53
【问题描述】:

我正在制作一个简单的程序,用于复制自上次运行以来创建或修改的文件。存储程序本身上次运行时间的最佳方式是什么?我在想它可以有一个文本文件来存储日期和时间,但是有没有一种不需要外部文件的方法? Windows 有“最后修改”日期,但我不知道“最后使用”日期。

【问题讨论】:

  • 通常的方法是创建一个注册表项来存储您的应用程序的信息(在HKEY_CURRENT_USER 中,因为最后一次运行可能因用户而异),或者在用户的%APPDATA% 中的文件中文件夹。
  • 如果我确实将它存储在一个文件中,与读取和写入包含程序上次时间的字符串相比,仅任意修改文件并检查文件的最后修改日期会更有效吗跑吗?
  • 相对于程序的其余部分,您打开、写入时间戳和关闭文件所花费的时间是微不足道的。编写人类可读的和机器可读的东西。
  • @Celeritas 是什么让您担心简单日期比较的性能。另请注意,解码/编码字符串比直接使用它更好。
  • 你想“任意”修改什么文件?文本文件本身?设置文件的最后修改标记比保存带有日期的文件更难,而且没有人说“包含时间的字符串”。二进制文件很容易工作,并且保存相同数据所需的存储空间更少。

标签: c++ filesystems last-modified


【解决方案1】:

我正在制作一个简单的程序,用于复制自上次运行以来创建或修改的文件。

这就是archive flag 的用途。每当创建或修改文件时,Windows 都会自动设置此标志。

您的程序只需跳过设置了存档标志的文件,然后复制并重置剩余文件上的存档标志。

【讨论】:

  • 如果您重置它,常规备份将不会检测到更改并将其备份(尤其是增量备份)。
  • @KenWhite 我认为常规 Windows 备份不再使用此标志。在我的机器上备份的未修改文件似乎都设置了存档位。当然,可能还有其他备份程序仍在使用此标志...
  • Windows 备份?真的有人用吗? ;-) 我没有反对,但这也不能处理每个用户的情况(并且需要对所有涉及的文件进行写访问才能翻转存档位 - UAC 有人吗?)。
【解决方案2】:

我认为任何方法都需要一个文件或修改过的文件,包括 cmets 中建议的注册表方法。虽然从技术上讲是一个文件,但 NT 文件系统的Alternative Data Stream 功能是一种方法。这是一个很好的描述。 http://www.bleepingcomputer.com/tutorials/windows-alternate-data-streams/

【讨论】:

  • 所以您的建议是为可执行文件本身存储一个替代数据流?这不仅需要更多的工作,而且还需要多个条目(每个用户帐户一个)和更多信息(哪个用户最后运行它)。对于所提出的问题,我认为这不是一个可行的选择。 (不反对,但完全不同意该策略。)
  • @KenWhite Petty 很容易让每个用户有一个流和一个最后执行日期,但我认为这不是解决问题的好方法,但它是一种方法。几乎任何方式都需要某种文件,并且您建议每个用户输入一个条目。
  • 对于所提出的问题,这似乎太复杂了。如果用户没有可执行文件的写权限怎么办?如果问题就像“存储应用程序运行的最后一个文件”一样简单,那么将文件快速写入本地用户的本地或漫游配置文件文件夹似乎会好得多(特别是因为发布者甚至不确定如何实现任务)。
  • @KenWhite 在安全方面的优点。我不明白你的复杂的事情。我可以从命令行写入备用流,基本上就像写入任何文件一样简单。
  • :-) 我知道。复杂性来自将多个替代流附加到同一个文件,这意味着您现在必须以某种方式将它们与当前用户识别(APPDATA 已经知道),复制文件存在问题(替代流是否与它一起使用,或者你把它们抛在脑后,重新开始)。我不是在谈论编写流本身的复杂性,而是涉及到的其他复杂性。
猜你喜欢
  • 2018-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-17
  • 1970-01-01
  • 1970-01-01
  • 2021-11-16
相关资源
最近更新 更多