El mapeo de archivos es un concepto en el que se puede crear un objeto de mapa de archivos para un archivo en el disco. Posteriormente, diferentes procesos pueden crear una vista de este objeto de asignación de archivos en sus espacios de direcciones virtuales. Un proceso puede crear una o más vistas del objeto de asignación de archivos en su espacio de direcciones virtuales y trabajar en él. A continuación se muestra el diagrama de trabajo para el objeto de asignación de archivos:
Recuerde los siguientes puntos clave
- El archivo está presente en el disco de la máquina en la que se ejecutan los procesos.
- El objeto de asignación de archivos está presente en la memoria física.
- Más de un proceso puede crear vistas para el mismo objeto de asignación de archivos.
- El objeto de asignación de archivos puede contener el archivo completo o una parte de él. De manera similar, la vista de archivos para procesos puede contener el objeto de asignación de archivos completo o una parte de él.
- Todas las copias son coherentes e iguales a las presentes en el disco .
Ventajas
- Es de gran ayuda cuando se trabaja con archivos grandes, como archivos de bases de datos, ya que no es necesario que el archivo completo esté presente en la memoria física.
- Más de un proceso puede usar un archivo en el disco para operaciones de lectura y escritura. Cada proceso puede crear una nueva vista, eliminando el mapeo de la vista de archivo actual.
Pasos para crear un objeto de asignación de archivos y una vista de archivos
Paso 1: Cree o abra un objeto de archivo que represente el archivo en el disco. Aquí, creamos un nuevo objeto de archivo con el identificador hFile y el nombre «datafile.txt» .
HANDLE CreateFileA( LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile ); // Can be used as HANDLE hFile = CreateFile(TEXT("datafile.txt"), GENERIC_READ | GENERIC_WRITE, 0, // Open with exclusive access NULL, // No security attributes // Creating a new temp file CREATE_NEW, // Delete the file after unmapping the view FILE_FLAG_DELETE_ON_CLOSE, NULL);
HANDLE CreateFileA( LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile ); // Can be used as HANDLE hFile = CreateFile(TEXT("datafile.txt"), GENERIC_READ | GENERIC_WRITE, 0, // open with exclusive access NULL, // no security attributes CREATE_NEW, // creating a new temp file FILE_FLAG_DELETE_ON_CLOSE, //delete the file after unmapping the view NULL);
Paso 2: cree un objeto de mapa para el archivo que contenga información sobre cómo acceder al archivo y su tamaño. Entonces, después de crear el archivo anterior, usamos su identificador y creamos su asignación en la memoria física.
HANDLE CreateFileMappingA( HANDLE hFile, LPSECURITY_ATTRIBUTES lpFileMappingAttributes, DWORD flProtect, DWORD dwMaximumSizeHigh, DWORD dwMaximumSizeLow, LPCSTR lpName ); // Can be used as HANDLE hFileMapping = ::CreateFileMappingA(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, bufferSize, filename);
Paso 3: asigne todo o parte del objeto de asignación de archivos de la memoria física al espacio de direcciones virtuales de su proceso. Así que aquí estamos creando la vista del archivo asignado que utilizará el proceso.
LPVOID MapViewOfFile( HANDLE hFileMappingObject, DWORD dwDesiredAccess, DWORD dwFileOffsetHigh, DWORD dwFileOffsetLow, SIZE_T dwNumberOfBytesToMap ); // Can be used as void* p = ::MapViewOfFile(hFileMapping, FILE_MAP_ALL_ACCESS, 0, param1, param2);
Paso 4: Limpieza
4(A) Quite la asignación del objeto de asignación de archivos del espacio de direcciones del proceso. Retroceda en los pasos anteriores y, en primer lugar, elimine las vistas de archivos del espacio de direcciones del proceso.
BOOL UnmapViewOfFile(LPCVOID lpBaseAddress ); // Can be used as UnmapViewOfFile(p);
4(B) Cierre el objeto de asignación de archivos. Este paso elimina la asignación de archivos de la memoria física.
CloseHandle(hFileMapping);
4(C) Cierre el objeto de archivo. Aquí, cierre el archivo abierto en el disco y libere el mango. Dado que en el primer paso configuramos el indicador FILE_FLAG_DELETE_ON_CLOSE , el archivo se eliminará después de este paso.
CloseHandle(hFile);
Nota:
- Cierre las manijas en el mismo orden o de lo contrario dará lugar a discrepancias.
- Cierre todos los identificadores de archivos abiertos antes de intentar eliminar el archivo.