【问题标题】:Most Efficient way of freqently(every 5 secs) updating/maintaining a file/vector mirror?频繁(每 5 秒)更新/维护文件/矢量镜像的最有效方式?
【发布时间】:2018-05-28 17:12:16
【问题描述】:

1)我有一个文件,其内容通过矢量类型容器进行镜像。

2) 每 5 秒左右检查一次文件内容(是否有更改)。

3) 对文件所做的任何更改都会导致向量被更新,从而保持镜像。

4)矢量的内容实时显示在屏幕上。

这个问题一定会出现很多,但是我没有找到满意的答案。这可能是答案恰好不令人满意,两者并不相互排斥,但让我们看看......

可能的解决方案:

仅使用基本的 C++ 和 STL。

1) 文件数据长度或上次读取位置。

每次读取后,存储上次读取位置。 任何新的读取都从上次读取位置开始。

缺点:

对现有文件数据的任何更改都不会被发现。

2) 哈希检查。

每次读取后,存储每个文件行的哈希值,以后可以用来检查/读取新的文件数据。

专业版:

对文件内容的任何更改都会反映在向量中。

缺点:

每个文件行都被读取、散列和存储......两次!

随着文件大小的增加而产生的开销。

3) 没有检查。

不检查任何内容,每次只读取整个文件并覆盖向量,无论文件内容如何更改。

专业版:

对文件内容的任何更改都会反映在向量中。

缺点:

?

【问题讨论】:

  • “仍然需要读取整个文件数据以确定当前文件数据长度”不,只需寻找最后一个读取位置并从那里开始读取以附加到向量。

标签: c++ file stl


【解决方案1】:

如果您在 Windows 上,只需让操作系统通知您受监控文件夹的更改即可。

https://msdn.microsoft.com/en-us/library/windows/desktop/aa365261(v=vs.85).aspx

这样您就不需要轮询并获取有关文件属性更改的信息(例如最后一次写入)

一旦您知道发生了实际更改,您就可以阅读/更新。

不确定它在其他操作系统上的表现如何。

【讨论】:

  • 一旦收到文件更改通知,...您会读取整个文件并覆盖现有向量吗?
  • 取决于您期望的文件修改类型。如果仅附加数据,您可以跳过第一部分并扩展。如果还有其他修改,读取整个文件可能是最不容易出错的方法。
  • @LearnMore 您在哪个平台上?不同的操作系统提供不同的通知机制。
猜你喜欢
  • 1970-01-01
  • 2019-07-09
  • 1970-01-01
  • 1970-01-01
  • 2016-10-28
  • 2020-12-09
  • 2017-10-17
  • 2011-10-23
  • 2011-03-19
相关资源
最近更新 更多