【问题标题】:Memory Mapped file in C++ read in JavaC++中的内存映射文件用Java读取
【发布时间】:2015-09-07 13:25:43
【问题描述】:

我有一个 C++ 程序,它在某一时刻使用

hMapFile = OpenFileMapping(dwDesiredAccess, bInheritHandle, lpName);

lpName 类似于"myfile",没有扩展名或路径,即内存映射文件。我可以在路径Sessions\1\BaseNamedObjects\myfile 中找到带有WinObj-Browser (WinObj) 的文件。如果我尝试用 Java 读取该特定文件,我尝试了

File file = new File("myfile");
FileChannel filechannel = new RandomAccessFile(file, "r").getChannel();
MappedByteBuffer buffer = filechannel.map(FileChannel.MapMode.READ_ONLY, 0, filechannel.size());

但我总是得到同样的错误:RandomAccessFile 命令中找不到指定的文件。也许需要另一个文件访问权限?哪一个?

据我了解其他帖子,他们总是使用路径和扩展名,但是,我不知道路径和扩展名会在我的情况下......

我正在寻找的是一种访问Kernel object namespacesKernel 对象命名空间的方法

我知道,有这个 JNI 示例 (Memorymap using JNI),但我想保持简单并使用 nio(如果可能的话)。

更新

所以我只是在 C# 中尝试了整个过程,它非常简单,只用了 5 行代码。

【问题讨论】:

  • C++程序的当前工作目录是什么?那就是创建文件的地方。如果未指定绝对路径,则文件名将在进程当前工作目录的相对路径中创建。如果C++和Java程序的两个工作目录不一样,不能真正使用相对路径,需要指定一个绝对路径,两个程序都一样,才能找到文件。
  • @ErwinBolwidt:是的,它确实存在,我在问题中写道,我可以在 winobj 浏览器中测试 Java 应用程序时访问该文件。 @JoachimPileborg:类似于C:\Project\server`, stupid question: the file is not visible in the explorer`,但我想不应该?
  • 文件映射对象不是文件系统的一部分。工作目录不相关。您还需要致电OpenFileMappingRandomAccessFile 不会那样做。
  • @DavidHeffernan: AFAIK OpenFileMapping 在 Java 中不存在,什么是等价的?
  • 我不知道Java库是否支持打开命名映射。 MappedByteBuffer 似乎要求您手头有一个文件系统文件名。我倾向于使用 JNI 或 JNA。

标签: java c++ winapi nio memory-mapped-files


【解决方案1】:

文件就是文件,我同意“Joachim Pileborg”的观点,Java 程序没有在其工作目录中获取文件。试试

String working dir = System.getProperty("user.dir");

并确保文件在正确的路径中。

【讨论】:

【解决方案2】:

您需要使用CreateFileMapping 而不是OpenFileMapping。这样,您将在磁盘上创建一个与文件映射关联的实际文件。

注意:请务必注意,使用常规读/写方法不会与不同进程的文件映射同步。所以你仍然需要在 Java 中使用 MappedByteBuffer 之类的东西

【讨论】:

  • 我认为提问者想要打开一个现有的映射,一个由不同进程创建的映射
  • @DavidHeffernan:是的。我也明白这一点。 CreateFileMapping 将创建一个新的或打开一个基于真实文件的现有文件映射(而不是 OpenFileMapping,它将打开现有映射或创建一个不基于任何真实文件的新映射。
  • CreateFileMapping 需要文件句柄。在我看来,用户将无法获得该文件句柄。因此,需要 OpenFileMapping。
  • 获取文件句柄就像CreateFile 具有特定文件名一样困难。可以在每个进程中使用不同的句柄(对同一个文件)。并且使用文件名可以创建一个 MappedByteBuffer 对象...
  • 为什么用户会知道那个特定的文件名?我想象用户只有文件映射对象的名称。这并不需要太多的想象力,因为它是问题中所写的。
猜你喜欢
  • 1970-01-01
  • 2020-11-06
  • 2021-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多