MemoryMappedFile and FileSystemWatcher
本文关键字:FileSystemWatcher and MemoryMappedFile | 更新日期: 2023-09-27 18:06:30
是否有可能将MemoryMappedFile和FileSystemWatcher结合起来?换句话说,如何为FileSystemWatcher的构造函数获取mem映射文件的路径:
new FileSystemWatcher(someMemMappedPath);
"someememmappedpath"应该包含什么字符串?
作者编辑:我不是从物理文件创建内存映射文件,而是从对象创建内存映射文件。我有多个应用程序(进程),我想模拟"事件"来相互通信——我不想使用命名管道。似乎无法连接FileSystemWatcher。我要一个线程轮询解决方案,而不是,我只是在文件中做一个标志,如果它被一个进程改变,这样另一个进程可以得到通知,当他们的线程读取文件。
我猜MemoryMappedFile
对象的期望是您自己知道文件名。例如,在MemoryMappedFile
对象中没有任何内容可以获取内存映射到的文件名。
您必须使用MemoryMappedFile.SafeMemoryMappedFileHandle
属性和pinvoke GetMappedFileName
来获得用于创建MemoryMappedFile
对象的原始文件名。
GetMappedFileName
的输出将是您传递给FileSystemWatcher
的内容
更新回答新问题
我不是从一个物理文件创建内存映射文件,而是从一个对象。我有多个应用程序(进程),我想模拟"事件"来相互通信——我不想使用命名管道
您应该仍然可以使用彼得斯的答案,因为磁盘上某处有一个文件,但是有一个自动生成的文件名。
但是,如果您希望能够在系统之间发送事件,这是一个脆弱的解决方案。当文件损坏时会发生什么?
一个更好的方法是引入消息队列。如果应用程序在同一台机器上,那么使用MSMQ非常容易。为每个应用程序创建一个队列,并将每个通知发送到每个队列。通过这种方式,您可以保证没有任何侦听器丢失消息。文章作为MSDN包含几个例子