Partager via


Création d’un objet de mappage de fichiers

La création d’un objet de mappage de fichiers dans Windows implique l’ouverture d’un fichier à l’aide de la fonction CreateFile . Ce processus vous permet de mapper le contenu du fichier directement en mémoire pour un accès et une manipulation efficaces. Pour vous assurer que d’autres processus ne peuvent pas écrire dans la partie du fichier mappé, 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 fichier 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 à l’objet existant. Vous pouvez indiquer 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 fichiers est indépendante de la taille du fichier mappé. Toutefois, si l’objet de mappage de fichiers est supérieur au fichier, le système développe le fichier avant que CreateFileMapping ne retourne. Si l’objet de mappage de fichiers est inférieur au 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 correspond 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 statiques en taille ; une fois créée, leur taille ne peut pas être augmentée ou réduite. Une tentative de mappage d’un fichier avec une longueur de zéro de cette façon é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 sauvegardé 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.

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 de taille de 500 Ko, vous n’avez accès qu’aux 500 premières Ko du fichier, quelle que soit la taille du fichier. Étant donné qu’il ne vous coûte aucune ressource système pour créer un objet de mappage de fichiers plus volumineux, créez un objet de mappage de fichiers qui correspond à la taille du fichier (définissez les paramètres dwMaximumSizeHigh et dwMaximumSizeLow de CreateFileMapping à zéro) même si vous ne vous attendez pas à afficher l’intégralité du fichier. 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 démarre pas au début du fichier. Pour plus d’informations, consultez Création d’un affichage dans un fichier.

Création d’une vue de fichier

Création d’une vue dans un fichier