MemoryMappedFile and FileSystemWatcher

本文关键字:FileSystemWatcher and MemoryMappedFile | 更新日期: 2023-09-27 18:06:30

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

new FileSystemWatcher(someMemMappedPath);

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

作者编辑:我不是从物理文件创建内存映射文件,而是从对象创建内存映射文件。我有多个应用程序(进程),我想模拟"事件"来相互通信——我不想使用命名管道。似乎无法连接FileSystemWatcher。我要一个线程轮询解决方案,而不是,我只是在文件中做一个标志,如果它被一个进程改变,这样另一个进程可以得到通知,当他们的线程读取文件。

MemoryMappedFile and FileSystemWatcher

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

您必须使用MemoryMappedFile.SafeMemoryMappedFileHandle属性和pinvoke GetMappedFileName来获得用于创建MemoryMappedFile对象的原始文件名。

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

更新回答新问题

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

您应该仍然可以使用彼得斯的答案,因为磁盘上某处有一个文件,但是有一个自动生成的文件名。

但是,如果您希望能够在系统之间发送事件,这是一个脆弱的解决方案。当文件损坏时会发生什么?

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

文章作为MSDN包含几个例子