Criando um objeto de mapeamento de arquivo

A primeira etapa no mapeamento de um arquivo é abrir o arquivo chamando a função CreateFile . Para garantir que outros processos não possam gravar na parte do arquivo mapeada, você deve abrir o arquivo com acesso exclusivo. Além disso, o identificador de arquivo deve permanecer aberto até que o processo não precise mais do objeto de mapeamento de arquivo. Uma maneira fácil de obter acesso exclusivo é especificar zero no parâmetro fdwShareMode de CreateFile. O identificador retornado por CreateFile é usado pela função CreateFileMapping para criar um objeto de mapeamento de arquivo.

A função CreateFileMapping retorna um identificador para o objeto de mapeamento de arquivo. Esse identificador será usado ao criar uma exibição de arquivo para que você possa acessar a memória compartilhada. Ao chamar CreateFileMapping, você especifica um nome de objeto, o número de bytes a serem mapeados do arquivo e a permissão de leitura/gravação para a memória mapeada. O primeiro processo que chama CreateFileMapping cria o objeto de mapeamento de arquivo. Os processos que chamam CreateFileMapping para um objeto existente recebem um identificador para o objeto existente. Você pode saber se uma chamada bem-sucedida para CreateFileMapping criou ou abriu o objeto de mapeamento de arquivo chamando a função GetLastError . GetLastError retorna NO_ERROR para o processo de criação e ERROR_ALREADY_EXISTS para processos subsequentes.

A função CreateFileMapping falhará se os sinalizadores de acesso entrarem em conflito com os especificados quando a função CreateFile abrir o arquivo. Por exemplo, para ler e gravar no arquivo:

  • Especifique os valores GENERIC_READ e GENERIC_WRITE no parâmetro fdwAccess de CreateFile.
  • Especifique o valor PAGE_READWRITE no parâmetro fdwProtect de CreateFileMapping.

A criação de um objeto de mapeamento de arquivo não confirma a memória física, apenas a reserva.

Tamanho do mapeamento de arquivo

O tamanho do objeto de mapeamento de arquivo é independente do tamanho do arquivo que está sendo mapeado. No entanto, se o objeto de mapeamento de arquivo for maior que o arquivo, o sistema expandirá o arquivo antes que CreateFileMapping retorne. Se o objeto de mapeamento de arquivo for menor que o arquivo, o sistema mapeará apenas o número especificado de bytes do arquivo.

Os parâmetros dwMaximumSizeHigh e dwMaximumSizeLow de CreateFileMapping permitem especificar o número de bytes a serem mapeados do arquivo:

  • Quando você não quiser que o tamanho do arquivo seja alterado (por exemplo, ao mapear arquivos somente leitura), chame CreateFileMapping e especifique zero para dwMaximumSizeHigh e dwMaximumSizeLow. Isso cria um objeto de mapeamento de arquivo exatamente do mesmo tamanho que o arquivo. Caso contrário, você deve calcular ou estimar o tamanho do arquivo concluído porque os objetos de mapeamento de arquivo são estáticos em tamanho; depois de criadas, seu tamanho não pode ser aumentado ou reduzido. Uma tentativa de mapear um arquivo com um comprimento igual a zero dessa maneira falha com um código de erro de ERROR_FILE_INVALID. Os programas devem testar arquivos com um comprimento igual a zero e rejeitar esses arquivos.

  • O tamanho de um objeto de mapeamento de arquivo que é apoiado por um arquivo nomeado é limitado pelo espaço em disco. O tamanho de uma exibição de arquivo é limitado ao maior bloco contíguo disponível de memória virtual sem reservas. Isso é no máximo 2 GB menos a memória virtual já reservada pelo processo.

O tamanho do objeto de mapeamento de arquivo selecionado controla até que ponto o arquivo pode "ver" com o mapeamento de memória. Se você criar um objeto de mapeamento de arquivo com 500 Kb de tamanho, terá acesso somente aos primeiros 500 Kb do arquivo, independentemente do tamanho do arquivo. Como não custa recursos do sistema para criar um objeto de mapeamento de arquivo maior, crie um objeto de mapeamento de arquivo que seja do tamanho do arquivo (defina os parâmetros dwMaximumSizeHigh e dwMaximumSizeLow de CreateFileMapping como zero), mesmo que você não espere exibir todo o arquivo. O custo em recursos do sistema vem na criação dos modos de exibição e no acesso a eles.

Você pode exibir uma parte do arquivo que não começa no início do arquivo. Para obter mais informações, consulte Criando uma exibição dentro de um arquivo.

Criando uma exibição de arquivo

Criando uma exibição dentro de um arquivo