从文件视图读取和写入

若要从文件视图读取数据,请取消引用 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 不为其分配磁盘空间的零区域,并且压缩文件占用的磁盘空间可能比它表示的实际数据少。 如果读取或写入的稀疏或压缩文件的一部分不受磁盘空间支持,操作系统可能会尝试分配磁盘空间。 如果磁盘已满,则可能导致异常,指示 I/O 错误。

结构化异常处理