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


Создание объекта сопоставления файлов

Первым шагом в сопоставлении файла является открытие файла путем вызова функции CreateFile . Чтобы другие процессы не могли выполнять запись в часть сопоставленного файла, следует открыть файл с монопольным доступом. Кроме того, дескриптор файла должен оставаться открытым до тех пор, пока процессу больше не нужен объект сопоставления файлов. Простой способ получить монопольный доступ — указать ноль в параметре fdwShareModecreateFile. Дескриптор, возвращаемый CreateFile, используется функцией CreateFileMapping для создания объекта сопоставления файлов.

Функция CreateFileMapping возвращает дескриптор объекту сопоставления файлов. Этот дескриптор будет использоваться при создании представления файла , чтобы получить доступ к общей памяти. При вызове CreateFileMapping указывается имя объекта, количество байтов, которые необходимо сопоставить с файлом, а также разрешение на чтение и запись для сопоставленной памяти. Первый процесс, вызывающий CreateFileMapping , создает объект сопоставления файлов. Процессы, вызывающие CreateFileMapping для существующего объекта, получают дескриптор существующего объекта. Вы можете определить, создал или открыл объект сопоставления файлов при успешном вызове CreateFileMapping , вызвав функцию GetLastError . GetLastError возвращает NO_ERROR в процесс создания и ERROR_ALREADY_EXISTS последующим процессам.

Функция CreateFileMapping завершается сбоем , если флаги доступа конфликтуют с флагами, указанными при открытии файла функцией CreateFile . Например, для чтения и записи в файл:

  • Укажите значения GENERIC_READ и GENERIC_WRITE в параметре fdwAccesscreateFile.
  • Укажите значение PAGE_READWRITE в параметре fdwProtectэлемента CreateFileMapping.

Создание объекта сопоставления файлов не фиксирует физическую память, а только резервирует ее.

Размер сопоставления файлов

Размер объекта сопоставления файлов не зависит от размера сопоставляемого файла. Однако если объект сопоставления файлов больше, чем файл, система развертывает файл до возврата CreateFileMapping . Если объект сопоставления файлов меньше файла, система сопоставляет из файла только указанное количество байтов.

Параметры dwMaximumSizeHigh и dwMaximumSizeLowэлемента CreateFileMapping позволяют указать количество байтов для сопоставления из файла:

  • Если вы не хотите, чтобы размер файла изменял (например, при сопоставлении файлов только для чтения), вызовите CreateFileMapping и укажите ноль для dwMaximumSizeHigh и dwMaximumSizeLow. При этом создается объект сопоставления файлов точно такого же размера, как и файл. В противном случае необходимо вычислить или оценить размер готового файла, так как объекты сопоставления файлов являются статическими по размеру; После создания их размер невозможно увеличить или уменьшить. Попытка сопоставить файл с нулевой длиной таким образом завершается сбоем с кодом ошибки ERROR_FILE_INVALID. Программы должны проверять наличие файлов нулевой длины и отклонять такие файлы.

  • Размер объекта сопоставления файлов, который поддерживается именованным файлом, ограничен дискового пространства. Размер представления файла ограничен самым большим доступным непрерывным блоком без резервирования виртуальной памяти. Это не более 2 ГБ за вычетом виртуальной памяти, уже зарезервированной процессом.

Размер выбранного объекта сопоставления файлов определяет, насколько далеко в файле можно "увидеть" с помощью сопоставления памяти. Если вы создаете объект сопоставления файлов размером 500 КБ, у вас есть доступ только к первым 500 КБ файла, независимо от размера файла. Так как создание объекта сопоставления файлов большего размера не требует затрат на системные ресурсы, создайте объект сопоставления файлов размером файла (задайте для параметров dwMaximumSizeHigh и dwMaximumSizeLowэлемента CreateFileMapping равным нулю), даже если вы не ожидаете просматривать весь файл. Затраты на системные ресурсы поступают за создание представлений и доступ к ним.

Вы можете просмотреть часть файла, которая не начинается в начале файла. Дополнительные сведения см. в разделе Создание представления в файле.

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

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