我面临的问题是否有某种奇特的名称,如“哲学家用餐问题”或“约瑟夫问题”等?这样我就可以对其进行一些研究。
我想在 Windows 中检索最新的日志文件。当日志文件已满(假设为 50MB)时,日志文件将更名为 log.2、log.3、log.4 ......等等,传入的日志将插入到 log.1 中。
现在,我有办法解决这个问题。如果最新文件 (log.1) 有任何更改,我会尝试间歇性地轮询服务器。 但是,我很快发现 log.1 在不可预测的时间更改为 log.2,导致我错过了日志文件(因为如果 log.1 在其“修改日期”中有任何更改,我只会检索 log.1 "属性)。
我希望我可以给出某种寓言来使这易于理解。我能想到的最接近的事情是,频闪仪以未知频率卡住风扇,给人一种风扇正在卡住的错觉,但实际上风扇已经旋转了很多时间。您明白了要点。
提前致谢。
最佳答案
解决方案是让您的程序跟踪文件 log.1 和 log.2 的最后修改日期。轮询时,检查 log.2 的更改,然后检查 log.1 的更改。
大多数时候,log.2 不会改变。当它出现时,你在那里读取更新的数据,然后在 log.1 中读取更新的数据。在代码中,它看起来像这样:
DateTime log1ModifiedDate // saved, and updated whenever it changes
DateTime log2ModifiedDate
if log2.DateModified != log2ModifiedDate
Read and process data from log.2
update log2ModifiedDate
if log1.DateModified != log1ModifiedDate
Read and process data from log.1
update log1ModifiedDate
我假设您的轮询频率足够高,log.1 不会翻转两次,以至于以前是 log.1 的文件现在是 log.3。如果您认为这可能发生,则必须检查 log.3 以及 log.2 和 log.1。
在 Windows 中处理此问题的另一种方法是实现文件更改通知,它会在目录中的文件更改时通知您。这些通知异步传送到您的程序。因此,您不是轮询,而是响应通知。在 .NET 中,您将使用 FileSystemWatcher .对于 Windows API,您将使用 FindFirstChangeNotification和相关的功能。 This CodeProject article举了一个不错的例子。
关于algorithm - 获取动态变化的日志文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23470395/