当另一个应用程序正在更新文件时,是否可以打开文本文件并读取内容,以免导致锁定冲突?
我需要监视来自一个应用程序的日志文件,每次发生事件时由另一个应用程序更新。
在我尝试阅读之前,我会检查文件是否正在使用,但这似乎并不适用于所有情况。
谢谢,彼得
答案 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)
FILE_SHARE_READ
。这意味着,“我,记录员,允许其他人读取我的文件”。我认为这些是最明智的价值观,它们会阻止锁定。其他组合可能是允许的。有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)