Compartilhar via


Criando um objeto de mapeamento de arquivo

A criação de um objeto de mapeamento de arquivo no Windows envolve a abertura de um arquivo usando a função CreateFile . Esse processo permite mapear o conteúdo do arquivo diretamente na memória para acesso e manipulação eficientes. Para garantir que outros processos não possam gravar na parte do arquivo mapeado, 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, especifique 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 ao 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 abriu 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 compromete a memória física, apenas 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 de CreateFileMapping retornar. 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. Fazer isso cria um objeto de mapeamento de arquivo que tem exatamente o mesmo tamanho do 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 de tamanho; uma vez criado, 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.

O tamanho do objeto de mapeamento de arquivo que você seleciona controla a distância no arquivo que você pode "ver" com o mapeamento de memória. Se você criar um objeto de mapeamento de arquivo com 500 Kb de tamanho, terá acesso apenas aos primeiros 500 Kb do arquivo, independentemente do tamanho do arquivo. Como não lhe custa nenhum recurso do sistema 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 ambos como zero), mesmo que você não espere exibir todo o arquivo. O custo em recursos ocorre na criação das visualizações e no acesso a elas.

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 vista dentro de um arquivo.

Criando uma exibição de arquivo

Criando uma exibição dentro de um arquivo