【发布时间】: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 theexplorer`,但我想不应该? -
文件映射对象不是文件系统的一部分。工作目录不相关。您还需要致电
OpenFileMapping。RandomAccessFile不会那样做。 -
@DavidHeffernan: AFAIK
OpenFileMapping在 Java 中不存在,什么是等价的? -
我不知道Java库是否支持打开命名映射。
MappedByteBuffer似乎要求您手头有一个文件系统文件名。我倾向于使用 JNI 或 JNA。
标签: java c++ winapi nio memory-mapped-files