ファイル ビューからの読み取りと書き込み

ファイル ビューから読み取る場合は、次の例に示すように 、MapViewOfFile 関数によって返されるポインターを逆参照します。

ページ ファイル以外のファイルのファイル ビューから読み取ったり、ファイル ビューに書き込んだりすると、 EXCEPTION_IN_PAGE_ERROR 例外が発生する可能性があります。 たとえば、リモート サーバー上に存在するマップされたファイルにアクセスすると、サーバーへの接続が失われた場合に例外が生成される可能性があります。 例外は、完全なディスク、基になるデバイスの障害、またはメモリ割り当てエラーが原因で発生する可能性もあります。 入出力 (I/O) エラーによる例外を防ぐために、メモリ マップされたファイルにアクセスするすべての試行を構造化例外ハンドラーにラップする必要があります。 __except フィルターでEXCEPTION_IN_PAGE_ERRORを受け取ったら、アドレスが現在アクセスしているマッピング内にあることを確認します。 その場合は、正常に復旧または失敗します。それ以外の場合は、例外を処理しないでください。

次の例では、 MapViewOfFile によって返されるポインターを使用して、ファイル ビューから読み取ります。

  DWORD dwLength;

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

次の例では、 MapViewOfFile によって返されるポインターを使用してファイル ビューに書き込みます。

  DWORD dwLength;

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

FlushViewOfFile 関数は、キャッシュされた書き込み操作が発生するのを待たずに、ファイル ビューの指定されたバイト数を物理ファイルにコピーします。

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

NTFS パーティションで圧縮ファイルまたはスパース ファイルをマッピングする場合は、ファイルの一部をページングするときに I/O エラーが発生する可能性があります。 この場合、 MapViewOfFile によってマップされたアドレス空間は、割り当てられたディスク領域によってサポートされない場合があります。 これは、スパース ファイルには、NTFS がディスク領域を割り当てない 0 の領域があり、圧縮ファイルが表す実際のデータよりも少ないディスク領域を占有する可能性があるためです。 ディスク領域でバックアップされていないスパース ファイルまたは圧縮ファイルの一部に対して読み取りまたは書き込みを行うと、オペレーティング システムがディスク領域の割り当てを試みる場合があります。 ディスクがいっぱいの場合は、I/O エラーを示す例外が発生する可能性があります。

構造化例外処理