Share via


Lectura y escritura desde una vista de archivo

Para leer desde una vista de archivo, desreferencia el puntero devuelto por la función MapViewOfFile como se muestra en los ejemplos siguientes.

Leer o escribir en una vista de archivo de un archivo distinto del archivo de página puede provocar una excepción de EXCEPTION_IN_PAGE_ERROR . Por ejemplo, el acceso a un archivo asignado que reside en un servidor remoto puede generar una excepción si se pierde la conexión al servidor. Las excepciones también pueden producirse debido a un disco completo, a un error de dispositivo subyacente o a un error de asignación de memoria. Para protegerse frente a excepciones debidos a errores de entrada y salida (E/S), todos los intentos de acceder a los archivos asignados a memoria deben encapsularse en controladores de excepciones estructurados. Cuando reciba EXCEPTION_IN_PAGE_ERROR en el filtro de __except , asegúrese de que la dirección está dentro de la asignación a la que está accediendo actualmente. Si es así, recupere o falle correctamente; de lo contrario, no controle la excepción.

En el ejemplo siguiente se usa el puntero devuelto por MapViewOfFile para leer desde la vista de archivo:

  DWORD dwLength;

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

En el ejemplo siguiente se usa el puntero devuelto por MapViewOfFile para escribir en la vista de archivo:

  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 función FlushViewOfFile copia el número especificado de bytes de la vista de archivo en el archivo físico, sin esperar a que se produzca la operación de escritura almacenada en caché:

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

Si va a asignar un archivo comprimido o disperso en una partición NTFS, es posible que se produzca un error de E/S adicional al paginar en una parte del archivo. En este caso, es posible que el espacio de direcciones asignado por MapViewOfFile no esté respaldado por el espacio en disco asignado. Esto se debe a que un archivo disperso puede tener regiones de ceros para las que NTFS no asigna espacio en disco y un archivo comprimido puede ocupar menos espacio en disco que los datos reales que representa. Si lee o escribe en una parte de un archivo disperso o comprimido que no está respaldado por el espacio en disco, el sistema operativo puede intentar asignar espacio en disco. Si el disco está lleno, esto puede dar lugar a una excepción que indica un error de E/S.

Control estructurado de excepciones