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


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

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

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