是否可以在另一个应用程序更新文件时打开文本文件并读取内容,这样不会导致锁定冲突?
我需要监视一个应用程序的日志文件,每次发生事件时该文件都会由另一个应用程序更新。
在尝试读取文件之前,我会检查文件是否正在使用中,但这似乎并非在所有情况下都有效。
谢谢,彼得
是否可以在另一个应用程序更新文件时打开文本文件并读取内容,这样不会导致锁定冲突?
我需要监视一个应用程序的日志文件,每次发生事件时该文件都会由另一个应用程序更新。
在尝试读取文件之前,我会检查文件是否正在使用中,但这似乎并非在所有情况下都有效。
谢谢,彼得
这取决于第一个应用程序如何打开该文件。
即,当调用 CreateFile API 打开文件时,有 dwShareMode 参数告诉 api 如何打开它(如果给定 0,则不能从其他应用程序 IIRC 访问它)。否则从该文件读取应该没有问题。如果我没记错的话,要检查该文件是否以只读方式打开,您可以调用类似
CreateFile(pchar(fName), GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0) ;
FILE_SHARE_READ
于对 CreateFile 的调用。它的意思是,“我,记录者,允许其他人阅读我的文件”。我认为这些是最明智的价值观,它们会防止锁定。其他组合可能是允许的。这里有一张桌子。
现在,您还没有说当它“似乎不适用于所有情况”时会发生什么。接下来要做什么将取决于细节。希望以上内容将为您提供足够的信息来找出问题所在。
您不会遇到锁定冲突,因为写入应用程序不太可能锁定文件。执行您建议的操作通常没有问题(这是 UNIX tail -f命令所做的),并且可以忽略确实发生的那些小故障。过去我写过几个日志监控应用程序,它们的工作原理是这样的,没有任何问题。
尝试使用FileSystemWatcher在文件更新时获取事件。
一个对德尔福更友好的链接
除了让文件共享正常工作(这可能取决于其他程序的要求)之外,一些程序会在访问之间关闭文件。
过去,我的程序等待文件可用,然后快速打开它,获取所需的数据并关闭它,我已经取得了成功。至少在 DOS 中,尝试访问锁定的文件会导致重试几次,并且我提高了此设置,因此如果其他程序在我拥有该文件时尝试获取该文件,它们只会被延迟并且永远不会看到错误。
我什至能够更新文件(我确保不会在两者之间关闭它!)而其他程序却一无所知。
丑陋至极,但我们无法更改其他程序,所以这是完成工作的唯一方法。它在内部部署了多年,我从未听到过该系统用户的窥视。当另一个程序控制的机器退役时,它终于消失了。
XpoLog 将在不更改您的环境或代码的情况下完成任务,XpoLog 日志监视器
Avar 是对的——你受制于这里的写作程序。如果他们锁定了文件,那么您可以做几件事:
1 - 检查“最后修改”日期时间的变化 - 如果发生变化,那么你就知道发生了什么事。
2 - 如果 mod datetime 确实发生了变化,那么(取决于文件的大小)创建文件的副本并检查.