Asignación de archivos en aplicaciones C++

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

  1. El archivo está presente en el disco de la máquina en la que se ejecutan los procesos.
  2. El objeto de asignación de archivos está presente en la memoria física.
  3. Más de un proceso puede crear vistas para el mismo objeto de asignación de archivos.
  4. 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.
  5. Todas las copias son coherentes e iguales a las presentes en el disco .

Ventajas

  1. 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.
  2. 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:

  1. Cierre las manijas en el mismo orden o de lo contrario dará lugar a discrepancias.
  2. Cierre todos los identificadores de archivos abiertos antes de intentar eliminar el archivo.

Publicación traducida automáticamente

Artículo escrito por goofyblah y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *