2015-06-22 16 views
18

Ho un programma C++ che utilizza a un certo puntoMemoria file mappato in C++ leggere in Java

hMapFile = OpenFileMapping(dwDesiredAccess, bInheritHandle, lpName); 

Il lpName è qualcosa di simile "myfile" senza estensioni o il percorso, vale a dire un file di memoria mappata. Riesco a trovare il file con WinObj -Browser (WinObj) nel percorso Sessions\1\BaseNamedObjects\myfile. Se provo a leggere quel particolare file in Java, ho provato

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

Ma ho sempre lo stesso errore: Impossibile trovare il file specificato al comando RandomAccessFile. Forse è necessario un altro accesso ai file? Quale?

quanto ho capito da altri messaggi, usano sempre un percorso e un prolungamento, però, non ho idea di che il percorso e l'estensione sarebbe nel mio caso ...

Quello che sto cercando, ho un modo per accedere alle Kernel object namespaces kernel namespace oggetto

so, c'è questo esempio JNI (Memorymap using JNI), tuttavia desidero mantenerlo semplice e utilizzando nio (se ancora possibile).

UPDATE

Così ho appena provato il tutto in C# ed è stato ridicolmente facile, non mi ha preso più di 5 righe di codice.

+1

Qual è la directory di lavoro corrente del programma C++? Ecco dove viene creato il file. Se non si specifica un percorso assoluto, il nome file viene creato nel percorso relativo dalla directory di lavoro corrente del processo. Se le due directory di lavoro del C++ e dei programmi Java non sono uguali, non è possibile utilizzare il percorso relativo, è necessario specificare un percorso assoluto, uguale in entrambi i programmi, per trovare il file. –

+0

@ErwinBolwidt: Sì, esiste, ho scritto nella domanda, che posso accedere a quel file mentre collaudo l'app Java nel browser winobj. @JoachimPileborg: È qualcosa come 'C: \ Project \ server \', domanda stupida: il file non è visibile in 'explorer', ma immagino che non dovrebbe? – rst

+1

L'oggetto di mappatura file non fa parte del file system. La directory di lavoro non è rilevante. Dovrai anche chiamare 'OpenFileMapping'. 'RandomAccessFile' non lo farà. –

risposta

-1

È necessario utilizzare CreateFileMapping anziché OpenFileMapping. In questo modo creerai un file reale sul disco che è associato alla mappatura dei file.

Nota: è importante notare che l'utilizzo di metodi di lettura/scrittura regolari NON verrà sincronizzato con una mappatura di file di un processo diverso. Quindi è ancora necessario utilizzare qualcosa come MappedByteBuffer in Java

+0

Penso che il richiedente voglia aprire una mappatura esistente, una creata da un altro processo –

+0

@DavidHeffernan: Sì. L'ho capito anche io. CreateFileMapping creerà un nuovo OR aprendo un mapping di file esistente basato su un file REAL (invece di OpenFileMapping che aprirà una mappatura esistente OPPURE ne creerà uno nuovo NON basato su alcun file reale. – Daniel

+0

CreateFileMapping richiede un handle di file. Mi sembra che l'utente non sarà in grado di ottenere quell'handle di file, quindi OpenFileMapping è ciò che è necessario –

1

Un file è un file, sono d'accordo con "Joachim Pileborg" che il programma Java non ha il file nella sua directory di lavoro. Prova

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

e assicurati che il file sia nel percorso corretto.

+0

Salve, non funzionerà, selezionare "File mappati in memoria non persistenti" in https://msdn.microsoft.com/en-us/library/dd997372%28v=vs.110%29.aspx. Sto parlando di memoria condivisa per IPC – rst