Lettura e scrittura da una visualizzazione file

Per leggere da una visualizzazione file, dereferenziare il puntatore restituito dalla funzione MapViewOfFile , come illustrato negli esempi seguenti.

La lettura da o la scrittura in una visualizzazione file di un file diverso dal file di pagina può causare un'eccezione EXCEPTION_IN_PAGE_ERROR . Ad esempio, l'accesso a un file mappato che risiede in un server remoto può generare un'eccezione se la connessione al server viene persa. Le eccezioni possono verificarsi anche a causa di un disco completo, di un errore del dispositivo sottostante o di un errore di allocazione della memoria. Per proteggere le eccezioni a causa di errori di input e output (I/O), tutti i tentativi di accesso ai file mappati di memoria devono essere inclusi nei gestori di eccezioni strutturati. Quando si riceve EXCEPTION_IN_PAGE_ERROR nel filtro __except , assicurarsi che l'indirizzo sia all'interno del mapping a cui si sta attualmente accedendo. In tal caso, ripristinare o non riuscire correttamente; in caso contrario, non gestire l'eccezione.

Nell'esempio seguente viene usato il puntatore restituito da MapViewOfFile per leggere dalla visualizzazione file:

  DWORD dwLength;

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

Nell'esempio seguente viene usato il puntatore restituito da MapViewOfFile per scrivere nella visualizzazione file:

  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 funzione FlushViewOfFile copia il numero specificato di byte della visualizzazione file nel file fisico, senza attendere che si verifichi l'operazione di scrittura memorizzata nella cache:

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

Se si esegue il mapping di un file compresso o sparse in una partizione NTFS, è possibile che si verifichi un errore di I/O durante il paging in una parte del file. In questo caso, lo spazio degli indirizzi mappato da MapViewOfFile potrebbe non essere supportato dallo spazio su disco allocato. Questo perché un file sparse può avere aree di zero per cui NTFS non alloca spazio su disco e un file compresso può richiedere meno spazio su disco rispetto ai dati effettivi che rappresenta. Se si legge o si scrive in una parte di un file sparse o compresso che non è supportato dallo spazio su disco, il sistema operativo può provare a allocare spazio su disco. Se il disco è pieno, questo può causare un'eccezione che indica un errore di I/O.

Gestione delle eccezioni strutturate