【发布时间】:2010-11-16 20:38:33
【问题描述】:
我有一个由第 3 方应用程序编写的日志文件,我希望我的应用程序实时/近乎实时地“读取”该日志文件,解析新的日志条目并对某些事件采取行动。
我的想法是,我可以结合使用 FileSystemWatcher(发出文件更改信号)和 MemoryMappedFile(从某个偏移量继续读取)来实现这一点。
但是,由于这是我第一次使用 MemoryMappedFiles,我确实遇到了一些问题,这可能是由于没有正确理解这个概念而引起的(例如,我无法打开现有文件,因为它正在被其他进程使用)。
我想知道是否有人有一个如何使用 MemoryMappedFiles 读取被另一个进程锁定的文件的示例?
谢谢,
汤姆
编辑:
从 cmets 看来,内存映射文件无法帮助我访问具有排他锁的文件。然而,“尾巴”工具,例如, Baretail (http://www.baremetalsoft.com/baretail/index.php) 能够做到这一点。以 1s 的间隔从另一个应用程序读取具有排他锁的文件没有问题)。那么,一定有办法做到这一点?
编辑编辑:
要回答我自己的问题,打开锁定文件的技巧是使用以下访问标志创建 FileStream:
fileStream = new System.IO.FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Delete | FileShare.ReadWrite);
【问题讨论】:
-
我在 James 的帖子中对所需的 FileShare 参数发表了评论。 MMF 无法解决完全锁定的文件,如果是这种情况,您会被卡住。
-
请看我上面的编辑。与 MMF 与 FileStream 现在相比,这个问题似乎更侧重于绕过排他锁。我已经尝试了多个 Windows 尾部工具,它们似乎都能够很好地解决独占锁,知道它们是如何实现的吗?
标签: c# .net memory-mapped-files