【问题标题】:MemoryMappedFile and FileSystemWatcherMemoryMappedFile 和 FileSystemWatcher
【发布时间】:2014-06-03 16:21:14
【问题描述】:

是否可以结合 MemoryMappedFile 和 FileSystemWatcher?也就是说,如何为FileSystemWatcher的构造函数获取一个mem映射文件的路径:

new FileSystemWatcher(someMemMappedPath);

“someMemMappedPath”应该包含什么字符串?

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

【问题讨论】:

  • 请有人解释为什么有人否决了这个问题?有什么依据?我不明白。

标签: c# memory-mapped-files


【解决方案1】:

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

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

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

【讨论】:

  • 感谢您的努力,但这对我不起作用。我会投票。
  • 为了清楚起见,我使用非路径名称创建文件,例如。 “mytempdata”,而不是“c:\temp\whatever”...所以我实际上不知道文件的位置,我认为该文件实际上并不存在于磁盘上。
【解决方案2】:

已更新以回答新问题

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

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

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

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

MSDN 的文章包含几个例子

【讨论】:

  • 如果 OP 已经有一个 MemoryMappedFile 对象并且不知道文件名,这如何回答他的问题?
  • @PeterRitchie:他在哪里说不是他创造的?
  • 如果他们创建了带有文件名的MemoryMappedFile,他们为什么要问FileSystemWatcher 使用什么文件名?
  • 我的意思是,如果他们创建了文件,他们可以切换到用于指定文件名的静态方法。
  • 那么问题的答案是someMemMappedPath = @"c:\ExtremelyLargeImage.data"...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-16
相关资源
最近更新 更多