Share via


Crear un objeto de asignación de archivos

El primer paso para asignar un archivo es abrir el archivo mediante una llamada a la función CreateFile . Para asegurarse de que otros procesos no pueden escribir en la parte del archivo asignado, debe abrir el archivo con acceso exclusivo. Además, el identificador de archivo debe permanecer abierto hasta que el proceso ya no necesite el objeto de asignación de archivos. Una manera sencilla de obtener acceso exclusivo es especificar cero en el parámetro fdwShareMode de CreateFile. La función CreateFileMapping usa el identificador devuelto por CreateFileMapping para crear un objeto de asignación de archivos.

La función CreateFileMapping devuelve un identificador al objeto de asignación de archivos. Este identificador se usará al crear una vista de archivo para que pueda acceder a la memoria compartida. Al llamar a CreateFileMapping, se especifica un nombre de objeto, el número de bytes que se asignarán desde el archivo y el permiso de lectura y escritura para la memoria asignada. El primer proceso que llama a CreateFileMapping crea el objeto de asignación de archivos. Los procesos que llaman a CreateFileMapping para un objeto existente reciben un identificador para el objeto existente. Puede indicar si una llamada correcta a CreateFileMapping ha creado o abierto el objeto de asignación de archivos llamando a la función GetLastError . GetLastError devuelve NO_ERROR al proceso de creación y ERROR_ALREADY_EXISTS a los procesos posteriores.

Se produce un error en la función CreateFileMapping si las marcas de acceso entran en conflicto con las especificadas cuando la función CreateFile abrió el archivo. Por ejemplo, para leer y escribir en el archivo:

  • Especifique los valores de GENERIC_READ y GENERIC_WRITE en el parámetro fdwAccess de CreateFile.
  • Especifique el valor PAGE_READWRITE en el parámetro fdwProtect de CreateFileMapping.

Al crear un objeto de asignación de archivos no se confirma la memoria física, solo se reserva.

Tamaño de asignación de archivos

El tamaño del objeto de asignación de archivos es independiente del tamaño del archivo que se va a asignar. Sin embargo, si el objeto de asignación de archivos es mayor que el archivo, el sistema expande el archivo antes de que Se devuelva CreateFileMapping . Si el objeto de asignación de archivos es menor que el archivo, el sistema asigna solo el número especificado de bytes del archivo.

Los parámetros dwMaximumSizeHizeHigh y dwMaximumSizeLow de CreateFileMapping permiten especificar el número de bytes que se asignarán desde el archivo:

  • Si no desea que el tamaño del archivo cambie (por ejemplo, al asignar archivos de solo lectura), llame a CreateFileMapping y especifique cero para dwMaximumSizeHigh y dwMaximumSizeLow. Al hacerlo, se crea un objeto de asignación de archivos que es exactamente el mismo tamaño que el archivo. De lo contrario, debe calcular o calcular el tamaño del archivo terminado porque los objetos de asignación de archivos son estáticos en tamaño; una vez creado, su tamaño no se puede aumentar ni disminuir. Se produce un error al intentar asignar un archivo con una longitud de cero de esta manera con un código de error de ERROR_FILE_INVALID. Los programas deben probar los archivos con una longitud de cero y rechazar dichos archivos.

  • El tamaño de un objeto de asignación de archivos respaldado por un archivo con nombre está limitado por el espacio en disco. El tamaño de una vista de archivo se limita al bloque contiguo más grande disponible de memoria virtual sin atender. Esto es como máximo 2 GB menos la memoria virtual ya reservada por el proceso.

El tamaño del objeto de asignación de archivos que seleccione controla hasta dónde se puede "ver" con la asignación de memoria. Si crea un objeto de asignación de archivos con un tamaño de 500 Kb, solo tiene acceso a los primeros 500 Kb del archivo, independientemente del tamaño del archivo. Puesto que no le cuesta ningún recurso del sistema crear un objeto de asignación de archivos más grande, cree un objeto de asignación de archivos que sea el tamaño del archivo (establezca los parámetros dwMaximumSizeHizeHigh y dwMaximumSizeLow de CreateFileMapping ambos en cero), incluso si no espera ver todo el archivo. El costo de los recursos del sistema incluye la creación de las vistas y el acceso a ellos.

Puede ver una parte del archivo que no se inicia al principio del archivo. Para obtener más información, vea Crear una vista dentro de un archivo.

Crear una vista de archivo

Crear una vista dentro de un archivo