从文件视图读取和写入
若要从文件视图读取数据,请取消引用 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 错误。
相关主题