2015-06-22 13 views
18

Mam program C++, który używa się w jednym punkciepamięci plik Mapowany w C++ odczytać w Javie

hMapFile = OpenFileMapping(dwDesiredAccess, bInheritHandle, lpName); 

lpName jest coś takiego "myfile" bez rozszerzeń lub ścieżki, to znaczy pliku pamięci odwzorowany. Mogę znaleźć plik z WinObj-Browser (WinObj) na ścieżce Sessions\1\BaseNamedObjects\myfile. Jeśli próbie odczytania tego konkretnego pliku w Javie, próbowałem

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

Ale mam zawsze ten sam błąd: Nie można odnaleźć określonego pliku na komendę RandomAccessFile. Może potrzebny jest inny dostęp do pliku? Który?

Jak rozumiem przez innych stanowisk, zawsze użyć ścieżki i rozszerzenia, jednak nie mam pojęcia, czy ścieżka i rozszerzenie byłoby w moim przypadku ...

Co szukam, i sposób, aby uzyskać dostęp do obiektów jądra Kernel object namespaces nazw

wiem, nie jest to przykład JNI (Memorymap using JNI), jednak chciałbym zachować to proste i używać nio (jeśli w ogóle możliwe).

UPDATE

Więc po prostu starał się całość w języku C# i było śmiesznie łatwe, nie zajmie mi więcej niż 5 linii kodu.

+1

Jaki jest bieżący katalog roboczy programu C++? Tam właśnie tworzony jest plik. Jeśli nie podasz bezwzględnej ścieżki, nazwa pliku zostanie utworzona w ścieżce względnej z bieżącego katalogu roboczego procesu. Jeśli dwa działające katalogi C++ i programy Java nie są takie same, nie można tak naprawdę użyć ścieżki względnej, należy określić ścieżkę bezwzględną, taką samą w obu programach, aby znaleźć plik. –

+0

@ErwinBolwidt: Tak, istnieje, napisałem w pytaniu, że mogę uzyskać dostęp do tego pliku podczas testowania aplikacji Java w przeglądarce winobj. @JoachimPileborg: Jest to coś w rodzaju 'C: \ Project \ server \', głupie pytanie: plik nie jest widoczny w 'explorer', ale myślę, że nie powinien? – rst

+1

Obiekt odwzorowania pliku nie jest częścią systemu plików. Katalog roboczy nie jest istotny. Będziesz także musiał wywołać 'OpenFileMapping'. 'RandomAccessFile' tego nie zrobi. –

Odpowiedz

-1

Musisz użyć CreateFileMapping zamiast OpenFileMapping. W ten sposób utworzysz rzeczywisty plik na dysku, który jest powiązany z mapowaniem pliku.

Uwaga: Należy zauważyć, że używanie zwykłych metod odczytu/zapisu NIE będzie synchronizowane z mapowaniem pliku innego procesu. Więc nadal musisz użyć czegoś takiego jak MappedByteBuffer w Javie

+0

Myślę, że osoba pytająca chce otworzyć istniejące mapowanie, utworzone przez inny proces. –

+0

@DavidHeffernan: Tak. Zrozumiałem to również. CreateFileMapping utworzy nowe LUB otworzy istniejące mapowanie plików oparte na pliku REAL (zamiast OpenFileMapping, które albo otworzy istniejące mapowanie, albo utworzy nowe, które NIE jest oparte na żadnym rzeczywistym pliku.) – Daniel

+0

CreateFileMapping wymaga uchwytu pliku. Wydaje mi się, że użytkownik nie będzie w stanie uzyskać tego uchwytu pliku, dlatego potrzebny jest OpenFileMapping: –

1

Plik jest plikiem, zgadzam się z "Joachim Pileborg", że program Java nie ma pliku w swoim katalogu roboczym. Wypróbuj

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

i upewnij się, że plik znajduje się we właściwej ścieżce.

+0

Witam, to nie zadziała, sprawdź "Nieodtrzymane pliki mapowane w pamięci" w https://msdn.microsoft.com/en-us/library/dd997372%28v=vs.110%29.aspx. Mówię o wspólnej pamięci dla IPC – rst

Powiązane problemy