日志文件监视器

时间:2009-04-10 08:28:52

标签: delphi file-io file-locking

当另一个应用程序正在更新文件时,是否可以打开文本文件并读取内容,以免导致锁定冲突?

我需要监视来自一个应用程序的日志文件,每次发生事件时由另一个应用程序更新。

在我尝试阅读之前,我会检查文件是否正在使用,但这似乎并不适用于所有情况。

谢谢,彼得

8 个答案:

答案 0 :(得分:10)

这取决于第一个应用程序打开该文件的方式。

,当调用CreateFile API打开文件时,有dwShareMode param告诉api如何打开它(如果给出0,则无法从其他应用程序IIRC访问它)。 否则从该文件读取应该没有问题。 如果我没有弄错,要检查该文件是否被打开只读你可以打电话

之类的东西
CreateFile(pchar(fName), GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0) ;

答案 1 :(得分:1)

  1. 从Sysinternals下载Process Monitor。
  2. 打开过滤器对话框,为日志文件添加“路径”过滤器。
  3. 启动日志编写应用程序(我称之为“logwriter”)。
  4. 查找并单击logwriter执行CreateFile的事件。
  5. 在“详细信息”下,它应具有“所需访问权限:通用写入”。它应该具有“ShareMode:Read”,它对应于CreateFile调用中的FILE_SHARE_READ。这意味着,“我,记录员,允许其他人读取我的文件”。
  6. 现在运行您的日志阅读应用程序(“logreader”),并执行相同的练习。
  7. 详细信息应具有“所需访问权限:通用读取”。它应该有“ShareMode:Read,Write”,这意味着“我,logreader,允许其他人,包括logwriter,读取和写入日志文件”。
  8. 我认为这些是最明智的价值观,它们会阻止锁定。其他组合可能是允许的。有is a table here

    现在,你还没有说过当“它似乎并不适用于所有情况”时会发生什么。下一步该做什么将取决于细节。希望上面的内容能为您提供足够的信息来解决出错的问题。

答案 2 :(得分:0)

您不会遇到锁定冲突,因为编写应用程序不太可能锁定文件。做你的建议通常没有问题(这是UNIX tail -f 命令所做的),并且可以忽略那些发生的小故障。我之前写了几个日志监控应用程序就像这样工作,没有任何问题。

答案 3 :(得分:0)

尝试使用FileSystemWatcher在文件更新时获取事件。

更多delphi友好link

答案 4 :(得分:0)

除了根据其他程序请求的内容使文件共享正常工作之外,某些程序将在访问之间关闭文件。

我过去已经取得了成功,我的程序正在等待文件可用,然后快速打开它,抓取所需数据并关闭它。至少在DOS中,尝试访问锁定的文件导致了一些重试,并且我提出了这个设置,所以如果其他程序尝试使用该文件,那么它们只会被延迟并且永远不会看到错误。

我甚至可以更新文件(我确保 NOT 在两者之间关闭它!)而其他程序不知道任何事情。

丑陋的罪,但我们无法改变其他程序,所以这是完成工作的唯一方法。它在内部部署多年,我从未听过该系统用户的窥视。当其他程序控制的机器退役时,它终于消失了。

答案 5 :(得分:0)

XpoLog将在不更改您的环境或代码的情况下完成这一操作,XpoLog日志监控器

答案 6 :(得分:0)

Avar是对的 - 你在这里写作程序是摆布的。如果他们正在锁定文件,那么您可以执行以下操作:

1 - 检查change in the "last modified" date time - 如果更改,则表示已发生

2 - 如果mod日期时间确实改变了,那么(取决于文件的大小)可能足以创建文件的副本并检查那个

答案 7 :(得分:0)

我们使用“Tail for win32”,

我知道它不是delphi但它可能有用

http://tailforwin32.sourceforge.net/