파일 보기에서 읽기 및 쓰기

파일 뷰에서 읽으려면 아래 예제와 같이 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 오류를 나타내는 예외가 발생할 수 있습니다.

구조적 예외 처리