Création d’un objet de mappage de fichiers

La première étape du mappage d’un fichier consiste à ouvrir le fichier en appelant la fonction CreateFile . Pour vous assurer que d’autres processus ne peuvent pas écrire dans la partie du fichier mappée, vous devez ouvrir le fichier avec un accès exclusif. En outre, le handle de fichier doit rester ouvert jusqu’à ce que le processus n’ait plus besoin de l’objet de mappage de fichiers. Un moyen simple d’obtenir un accès exclusif consiste à spécifier zéro dans le paramètre fdwShareMode de CreateFile. Le handle retourné par CreateFile est utilisé par la fonction CreateFileMapping pour créer un objet de mappage de fichiers.

La fonction CreateFileMapping retourne un handle à l’objet de mappage de fichiers. Ce handle sera utilisé lors de la création d’une vue de fichiers afin que vous puissiez accéder à la mémoire partagée. Lorsque vous appelez CreateFileMapping, vous spécifiez un nom d’objet, le nombre d’octets à mapper à partir du fichier et l’autorisation de lecture/écriture pour la mémoire mappée. Le premier processus qui appelle CreateFileMapping crée l’objet de mappage de fichiers. Les processus appelant CreateFileMapping pour un objet existant reçoivent un handle pour l’objet existant. Vous pouvez déterminer si un appel réussi à CreateFileMapping a créé ou ouvert l’objet de mappage de fichiers en appelant la fonction GetLastError . GetLastError retourne NO_ERROR au processus de création et ERROR_ALREADY_EXISTS aux processus suivants.

La fonction CreateFileMapping échoue si les indicateurs d’accès sont en conflit avec ceux spécifiés lorsque la fonction CreateFile a ouvert le fichier. Par exemple, pour lire et écrire dans le fichier :

  • Spécifiez les valeurs GENERIC_READ et GENERIC_WRITE dans le paramètre fdwAccess de CreateFile.
  • Spécifiez la valeur PAGE_READWRITE dans le paramètre fdwProtect de CreateFileMapping.

La création d’un objet de mappage de fichiers ne valide pas la mémoire physique, elle la réserve uniquement.

Taille du mappage de fichiers

La taille de l’objet de mappage de fichier est indépendante de la taille du fichier en cours de mappage. Toutefois, si l’objet de mappage de fichiers est plus grand que le fichier, le système le développe avant que CreateFileMapping ne retourne. Si l’objet de mappage de fichiers est plus petit que le fichier, le système mappe uniquement le nombre spécifié d’octets du fichier.

Les paramètres dwMaximumSizeHigh et dwMaximumSizeLow de CreateFileMapping vous permettent de spécifier le nombre d’octets à mapper à partir du fichier :

  • Lorsque vous ne souhaitez pas que la taille du fichier change (par exemple, lors du mappage de fichiers en lecture seule), appelez CreateFileMapping et spécifiez zéro pour dwMaximumSizeHigh et dwMaximumSizeLow. Cela crée un objet de mappage de fichiers qui a exactement la même taille que le fichier. Sinon, vous devez calculer ou estimer la taille du fichier terminé, car les objets de mappage de fichiers sont de taille statique ; une fois créées, leur taille ne peut pas être augmentée ou réduite. Une tentative de mapper un fichier avec une longueur de zéro de cette manière échoue avec un code d’erreur de ERROR_FILE_INVALID. Les programmes doivent tester les fichiers dont la longueur est égale à zéro et rejeter ces fichiers.

  • La taille d’un objet de mappage de fichiers soutenu par un fichier nommé est limitée par l’espace disque. La taille d’une vue de fichier est limitée au plus grand bloc contigu disponible de mémoire virtuelle non réservée. Il s’agit au maximum de 2 Go moins la mémoire virtuelle déjà réservée par le processus.

La taille de l’objet de mappage de fichiers que vous sélectionnez contrôle la distance dans le fichier que vous pouvez « voir » avec le mappage de mémoire. Si vous créez un objet de mappage de fichiers d’une taille de 500 Ko, vous avez accès uniquement aux 500 premiers Ko du fichier, quelle que soit la taille du fichier. Étant donné que la création d’un objet de mappage de fichiers plus volumineux ne vous coûte pas de ressources système, créez un objet de mappage de fichiers qui correspond à la taille du fichier (définissez les paramètres dwMaximumSizeHigh et dwMaximumSizeLow de CreateFileMapping sur zéro), même si vous ne prévoyez pas d’afficher le fichier entier. Le coût des ressources système est lié à la création des vues et à leur accès.

Vous pouvez afficher une partie du fichier qui ne commence pas au début du fichier. Pour plus d’informations, consultez Création d’une vue dans un fichier.

Création d’un affichage de fichiers

Création d’une vue dans un fichier