Lecture et écriture à partir d’un affichage de fichier

Pour lire à partir d’un affichage de fichiers, déréférencez le pointeur retourné par la fonction MapViewOfFile , comme illustré dans les exemples ci-dessous.

La lecture ou l’écriture dans une vue de fichier d’un fichier autre que le fichier de page peut entraîner une exception EXCEPTION_IN_PAGE_ERROR . Par exemple, l’accès à un fichier mappé qui réside sur un serveur distant peut générer une exception si la connexion au serveur est perdue. Des exceptions peuvent également se produire en raison d’un disque saturé, d’une défaillance d’appareil sous-jacente ou d’un échec d’allocation de mémoire. Pour vous protéger contre les exceptions dues à des erreurs d’entrée et de sortie (E/S), toutes les tentatives d’accès aux fichiers mappés en mémoire doivent être encapsulées dans des gestionnaires d’exceptions structurés. Lorsque vous recevez EXCEPTION_IN_PAGE_ERROR dans votre filtre de __except , assurez-vous que l’adresse se trouve dans le mappage auquel vous accédez actuellement. Si c’est le cas, récupérez ou échouez normalement ; sinon, ne gérez pas l’exception.

L’exemple suivant utilise le pointeur retourné par MapViewOfFile pour lire à partir de la vue de fichiers :

  DWORD dwLength;

  __try
  {
    dwLength = *((LPDWORD) lpMapAddress);
  }
  __except(GetExceptionCode()==EXCEPTION_IN_PAGE_ERROR ?
    EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH)
  {
    // Failed to read from the view.
  }

L’exemple suivant utilise le pointeur retourné par MapViewOfFile pour écrire dans la vue de fichiers :

  DWORD dwLength;

  __try
  {
    *((LPDWORD) lpMapAddress) = dwLength;
  }
  __except (GetExceptionCode() == EXCEPTION_IN_PAGE_ERROR ? 
    EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH)
  {
    // Failed to write to the view.
  }

La fonction FlushViewOfFile copie le nombre spécifié d’octets de l’affichage de fichiers dans le fichier physique, sans attendre que l’opération d’écriture mise en cache se produise :

  if (!FlushViewOfFile(lpMapAddress, dwBytesToFlush)) 
  {
    printf("Could not flush memory to disk (%d).\n", GetLastError()); 
  }

Si vous mappez un fichier compressé ou partiellement alloué sur une partition NTFS, il existe un risque supplémentaire d’erreur d’E/S lors de la pagination dans une partie du fichier. Dans ce cas, l’espace d’adressage mappé par MapViewOfFile peut ne pas être sauvegardé par l’espace disque alloué. En effet, un fichier partiellement alloué peut avoir des régions de zéros pour lesquelles NTFS n’alloue pas d’espace disque, et un fichier compressé peut prendre moins d’espace disque que les données réelles qu’il représente. Si vous lisez ou écrivez dans une partie d’un fichier partiellement alloué ou compressé qui n’est pas sauvegardé par l’espace disque, le système d’exploitation peut essayer d’allouer de l’espace disque. Si le disque est plein, une exception peut indiquer une erreur d’E/S.

Gestion structurée des exceptions