MemoryMappedFile和FileSystemWatcher

时间:2014-06-02 15:58:16

标签: c# memory-mapped-files

是否可以将MemoryMappedFile和FileSystemWatcher结合起来?换句话说,如何为FileSystemWatcher的构造函数获取mem映射文件的路径:

new FileSystemWatcher(someMemMappedPath);

什么字符串应该" someMemMappedPath"包含?

作者编辑:我不是从物理文件创建内存映射文件,而是从对象创建。我有多个应用程序(进程),我想模拟"事件"彼此沟通 - 我不想使用命名管道。似乎无法挂钩FileSystemWatcher。我正在寻找一个线程轮询解决方案,我只是在文件中创建一个标志,如果它被一个进程更改,那么当他们的线程读取文件时,另一个进程可以得到通知。

2 个答案:

答案 0 :(得分:1)

我猜对MemoryMappedFile个对象的期望是你自己知道文件名。即MemoryMappedFile对象中没有任何内容可以获取内存映射到的文件名。

您必须使用MemoryMappedFile.SafeMemoryMappedFileHandle属性并转发GetMappedFileName以获取用于创建MemoryMappedFile对象的原始文件名。

GetMappedFileName的输出将是您传递给FileSystemWatcher的内容。

答案 1 :(得分:0)

已更新以回答新问题

  

我不是从物理文件创建内存映射文件,而是从对象创建。我有多个应用程序(进程),我想模拟“事件”来相互通信 - 我不想使用命名管道

你仍然可以使用Peters的答案,因为磁盘上有一个文件,但是有一个自动生成的文件名。

但是,如果您希望能够在易碎解决方案的系统之间发送事件。文件损坏后会发生什么?

更好的方法是引入消息队列。如果应用程序在同一台机器上,那么使用MSMQ非常容易。为每个应用程序创建一个队列并将每个通知发送到每个队列通过这种方式,您可以保证没有任何一个听众丢失消息。

文章MSDN包含几个例子