如何检测文件是不是已更改?

Posted

技术标签:

【中文标题】如何检测文件是不是已更改?【英文标题】:How to detect if a file has changed?如何检测文件是否已更改? 【发布时间】:2015-01-21 10:23:31 【问题描述】:

我正在尝试编写一个用于处理巨大文件的文字处理器程序。现在每当用户关闭文件时,如果文件已被修改,我会提示他们“是否要保存文件”。

我正在使用每当用户执行任何写操作时设置的脏位来实现这一点。

但是,这有一个限制,即当文件实际上并不脏时,它会被视为脏文件。例如,如果用户键入一个字符并将其删除,则该文件没有更改。但是我的“脏位”实现认为它已经改变了。

就速度而言,检测文件是否真的发生变化的最佳方法是什么?

对整个文件进行完整的逐位比较太慢了。 (比较文件哈希也太慢了,因为需要处理整个文件来计算哈希。在比较值之前先进行长度比较在长度不同时有效,但在长度不同时失败 't,就像我上面的例子一样。)

【问题讨论】:

【参考方案1】:

由于这是一个文字处理程序,它也可以有操作历史。您可以维护 2 个堆栈,一个用于历史操作(已合并的更改),另一个用于将来的操作(已应用但现在已以线性方式恢复的更改)。

例如,按顺序输入的每个字符都可以是动作堆栈中的一项,将其删除可能相当于将该动作从历史项目堆栈弹出到未来动作堆栈(以防您需要重做动作)。

现在,只要历史操作的堆栈不为空,您就会提示用户在关闭时关闭文件。

为简单起见,您可以设置有限数量的历史记录项(例如最近 100 个操作)。然后,由于每个用户操作都会对文档进行每次添加/减去操作,因此几乎没有任何延迟,并且确定堆栈是否为空是一个 O(1) 操作。

【讨论】:

我会 +1,但我认为这不适用于更复杂的情况。举个例子,当用户编辑他的“header”,然后编辑他的“footer”,然后删除他的“body”,然后编辑他的“footer”,使其看起来像他以前的“header”,然后附加一个“footer”看起来像他以前的“页脚”,然后插入一个看起来像他以前的“身体”的“身体”。你明白了,他到处剪,贴,贴,剪,所以有很多变化,但最终的内容没有改变。 @TwentyTwo 如果你想了解那个级别的细节,你将不得不检查整个文件的内容,没有别的办法。例如,我有一个 1000 个字符的文件,现在我一个字符一个字符地从中删除数据,然后一个字符一个字符地添加回来。即使有 2000 个动作,网络文件也是一样的。就复杂性而言,它根本不可能以任何其他方式跟踪。 FWIW,从实现的角度来看,跟踪历史记录要容易得多,而且很多文本编辑器都准确地跟踪了这一点。 @TwentyTwo 那么你能解决这个问题吗?我很想知道您为此目的选择的算法:)

以上是关于如何检测文件是不是已更改?的主要内容,如果未能解决你的问题,请参考以下文章

如何检测文件是不是被覆盖?

如何检测存储过程是不是已存在

如何检测是不是已在android中访问过联系人

如何检测文件是不是已使用 Cocoa 重命名?

如何在 React 中检测屏幕尺寸是不是已更改为移动设备?

如何检测 xamarin UWP 应用程序中标签元素的文本值更改?