Поделиться через


Чтение и запись из представления файла

Чтобы прочитать из представления файла, разыменуйте указатель, возвращаемый функцией MapViewOfFile, как показано в примерах ниже.

Чтение или запись в представление файла, отличного от файла страницы, может вызвать исключение EXCEPTION_IN_PAGE_ERROR. Например, доступ к сопоставленному файлу, который находится на удаленном сервере, может вызвать исключение, если соединение с сервером потеряно. Исключения также могут возникать из-за полного диска, сбоя базового устройства или сбоя выделения памяти. Чтобы защититься от исключений из-за ошибок ввода-вывода, все попытки доступа к файлам сопоставления памяти должны быть обернуты в структурированные обработчики исключений. При получении EXCEPTION_IN_PAGE_ERROR в фильтре __except убедитесь, что адрес находится в сопоставлении, к которому вы в настоящее время обращаетесь. Если да, восстановление или сбой корректно; в противном случае не обрабатывайте исключение.

В следующем примере используется указатель, возвращаемый 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, при разбиении по страницам в части файла может возникнуть дополнительная ошибка ввода-вывода. В этом случае адресное пространство, отображенное MapViewOfFile, может не поддерживаться выделенным местом на диске. Это связано с тем, что разреженный файл может иметь области нуля, для которых NTFS не выделяет место на диске, а сжатый файл может занять меньше места на диске, чем фактические данные, которые он представляет. Если вы считываете или записываете данные в часть разреженного или сжатого файла, не обеспеченную дисковым пространством, операционная система может попытаться выделить место на диске. Если диск заполнен, это может привести к исключению, указывающее на ошибку ввода-вывода.

Структурированная обработка исключений