Creazione di un oggetto mappatura file

Il primo passaggio del mapping di un file consiste nell'aprire il file chiamando la funzioneCreateFile. Per assicurarsi che altri processi non possano scrivere nella parte del file di cui è stato eseguito il mapping, è necessario aprire il file con accesso esclusivo. Inoltre, l'handle di file deve rimanere aperto fino a quando il processo non ha più bisogno dell'oggetto di mappatura del file. Un modo semplice per ottenere l'accesso esclusivo consiste nel specificare zero nel parametro fdwShareMode di CreateFile. L'handle restituito da CreateFile viene utilizzato dalla funzioneCreateFileMappingper creare un oggetto di mapping di file.

La funzioneCreateFileMappingrestituisce un handle all'oggetto di mapping dei file. Questo handle verrà usato quando si crea una visualizzazione file in modo da poter accedere alla memoria condivisa. Quando si chiama CreateFileMapping, si specifica un nome di oggetto, il numero di byte di cui eseguire il mapping dal file e l'autorizzazione di lettura/scrittura per la memoria mappata. Il primo processo che chiama CreateFileMapping crea l'oggetto di file mapping. Processi che chiamano CreateFileMapping per un oggetto esistente ricevono un handle per l'oggetto esistente. È possibile stabilire se una chiamata riuscita a CreateFileMapping abbia creato o aperto l'oggetto di mapping file chiamando la funzione GetLastError. GetLastError restituisce NO_ERROR al processo di creazione e ERROR_ALREADY_EXISTS ai processi successivi.

La funzioneCreateFileMappingha esito negativo se i flag di accesso sono in conflitto con quelli specificati quando la funzioneCreateFileha aperto il file. Ad esempio, per leggere e scrivere nel file:

  • Specificare i valori GENERIC_READ e GENERIC_WRITE nel parametro fdwAccess di CreateFile.
  • Specificare il valore PAGE_READWRITE nel parametro fdwProtect di CreateFileMapping.

La creazione di un oggetto di mapping di file non esegue il commit della memoria fisica, ma la riserva soltanto.

Dimensioni del mapping del file

Le dimensioni dell'oggetto di mapping del file sono indipendenti dalle dimensioni del file di cui viene eseguito il mapping. Tuttavia, se l'oggetto di mapping del file è maggiore del file, il sistema espande il file prima che CreateFileMapping restituisca il controllo. Se l'oggetto di mapping dei file è minore del file, il sistema esegue il mapping solo del numero specificato di byte dal file.

I parametri dwMaximumSizeHigh e dwMaximumSizeLow di CreateFileMapping consentono di specificare il numero di byte da mappare dal file:

  • Quando non si desidera modificare le dimensioni del file , ad esempio quando si esegue il mapping di file di sola lettura, chiamare CreateFileMapping e specificare zero sia per dwMaximumSizeHigh che per dwMaximumSizeLow. In questo modo viene creato un oggetto di mapping di file che corrisponde esattamente alla stessa dimensione del file. In caso contrario, è necessario calcolare o stimare le dimensioni del file finito perché gli oggetti di mapping dei file sono statici in dimensioni; una volta creata, le dimensioni non possono essere aumentate o ridotte. Un tentativo di eseguire il mapping di un file con una lunghezza pari a zero in questo modo non riesce con un codice di errore di ERROR_FILE_INVALID. I programmi devono verificare la disponibilità di file con una lunghezza pari a zero e rifiutare tali file.

  • Le dimensioni di un oggetto di mapping di file supportato da un file denominato sono limitate dallo spazio su disco. Le dimensioni di una visualizzazione file sono limitate al blocco contiguo più grande disponibile di memoria virtuale non riservata. Si tratta al massimo di 2 GB meno la memoria virtuale già riservata dal processo.

La dimensione dell'oggetto di mapping del file selezionato determina quanto in profondità nel file si può "vedere" con il mapping di memoria. Se si crea un oggetto di mapping di file con dimensioni pari a 500 Kb, si ha accesso solo ai primi 500 Kb del file, indipendentemente dalle dimensioni del file. Poiché non richiede risorse di sistema per creare un oggetto di mapping file di dimensioni maggiori, creare un oggetto di mapping file che corrisponde alle dimensioni del file (impostare entrambi i parametri dwMaximumSizeHigh e dwMaximumSizeLow di CreateFileMapping a zero) anche se non si prevede di visualizzare l'intero file. Il costo in risorse di sistema si manifesta nella creazione e nell'accesso alle visualizzazioni.

È possibile visualizzare una parte del file che non inizia all'inizio del file. Per altre informazioni, vedere Creazione di una vista all'interno di un file.

Creazione di una visualizzazione file

Creazione di una vista all'interno di un file