4

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

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

在尝试读取文件之前,我会检查文件是否正在使用中,但这似乎并非在所有情况下都有效。

谢谢,彼得

4

8 回答 8

10

这取决于第一个应用程序如何打开该文件。

即,当调用 CreateFile API 打开文件时,有 dwShareMode 参数告诉 api 如何打开它(如果给定 0,则不能从其他应用程序 IIRC 访问它)。否则从该文件读取应该没有问题。如果我没记错的话,要检查该文件是否以只读方式打开,您可以调用类似

CreateFile(pchar(fName), GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0) ;
于 2009-04-10T08:59:50.957 回答
1
  1. 从 Sysinternals 下载进程监视器。
  2. 打开过滤器对话框并为您的日志文件添加一个“路径”过滤器。
  3. 启动日志写入应用程序(我称其为“logwriter”)。
  4. 查找并单击 logwriter 执行 CreateFile 的事件。
  5. 在“详细信息”下,它应该具有“所需访问权限:通用写入”。它应该有“ShareMode:Read”,对应FILE_SHARE_READ于对 CreateFile 的调用。它的意思是,“我,记录者,允许其他人阅读我的文件”。
  6. 现在运行你的日志阅读应用程序(“logreader”),并做同样的练习。
  7. 详细信息应具有“所需访问权限:通用读取”。它应该有“ShareMode:Read,Write”,意思是“我,logreader,允许其他人,包括logwriter,对日志文件进行读写”。

我认为这些是最明智的价值观,它们会防止锁定。其他组合可能是允许的。这里有一张桌子

现在,您还没有说当它“似乎不适用于所有情况”时会发生什么。接下来要做什么将取决于细节。希望以上内容将为您提供足够的信息来找出问题所在。

于 2009-04-11T01:28:08.790 回答
0

您不会遇到锁定冲突,因为写入应用程序不太可能锁定文件。执行您建议的操作通常没有问题(这是 UNIX tail -f命令所做的),并且可以忽略确实发生的那些小故障。过去我写过几个日志监控应用程序,它们的工作原理是这样的,没有任何问题。

于 2009-04-10T08:33:14.267 回答
0

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

一个对德尔福更友好的链接

于 2009-04-10T08:35:03.687 回答
0

除了让文件共享正常工作(这可能取决于其他程序的要求)之外,一些程序会在访问之间关闭文件。

过去,我的程序等待文件可用,然后快速打开它,获取所需的数据并关闭它,我已经取得了成功。至少在 DOS 中,尝试访问锁定的文件会导致重试几次,并且我提高了此设置,因此如果其他程序在我拥有该文件时尝试获取该文件,它们只会被延迟并且永远不会看到错误。

我什至能够更新文件(我确保不会在两者之间关闭它!)而其他程序却一无所知。

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

于 2009-04-11T01:40:50.443 回答
0

XpoLog 将在不更改您的环境或代码的情况下完成任务,XpoLog 日志监视器

于 2009-12-02T13:49:44.177 回答
0

Avar 是对的——你受制于这里的写作程序。如果他们锁定了文件,那么您可以做几件事:

1 - 检查“最后修改”日期时间的变化 - 如果发生变化,那么你就知道发生了什么事。

2 - 如果 mod datetime 确实发生了变化,那么(取决于文件的大小)创建文件的副本并检查.

于 2009-12-02T14:56:35.210 回答
0

我们使用“Win32 的尾巴”,

我知道它不是德尔福,但它可能有用

http://tailforwin32.sourceforge.net/

于 2009-12-03T04:21:32.700 回答