Compartilhar via


Leitura e gravação de um modo de exibição de arquivo

Para ler de um modo de exibição de arquivo, desreferenciar o ponteiro retornado pela função MapViewOfFile , conforme mostrado nos exemplos abaixo.

Ler ou gravar em uma exibição de arquivo de um arquivo diferente do arquivo de página pode causar uma exceção EXCEPTION_IN_PAGE_ERROR . Por exemplo, acessar um arquivo mapeado que reside em um servidor remoto pode gerar uma exceção se a conexão com o servidor for perdida. Exceções também podem ocorrer devido a um disco completo, uma falha de dispositivo subjacente ou uma falha de alocação de memória. Para proteger contra exceções devido a erros de E/S (entrada e saída), todas as tentativas de acessar arquivos mapeados na memória devem ser encapsuladas em manipuladores de exceção estruturados. Ao receber EXCEPTION_IN_PAGE_ERROR no filtro __except , verifique se o endereço está dentro do mapeamento que você está acessando no momento. Nesse caso, recupere ou falhe normalmente; caso contrário, não manipule a exceção.

O exemplo a seguir usa o ponteiro retornado por MapViewOfFile para ler a partir do modo de exibição de arquivo:

  DWORD dwLength;

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

O exemplo a seguir usa o ponteiro retornado por MapViewOfFile para gravar no modo de exibição de arquivo:

  DWORD dwLength;

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

A função FlushViewOfFile copia o número especificado de bytes da exibição de arquivo para o arquivo físico, sem esperar que a operação de gravação armazenada em cache ocorra:

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

Se você estiver mapeando um arquivo compactado ou esparso em uma partição NTFS, há potencial adicional para um erro de E/S ao paginar em uma parte do arquivo. Nesse caso, o espaço de endereço mapeado por MapViewOfFile pode não ser apoiado por espaço em disco alocado. Isso ocorre porque um arquivo esparso pode ter regiões de zeros para as quais o NTFS não aloca espaço em disco e um arquivo compactado pode ocupar menos espaço em disco do que os dados reais que ele representa. Se você ler ou gravar em uma parte de um arquivo esparso ou compactado que não tem suporte de espaço em disco, o sistema operacional poderá tentar alocar espaço em disco. Se o disco estiver cheio, isso poderá resultar em uma exceção que indica um erro de E/S.

Tratamento de exceções estruturadas