¿Cómo obtener la siguiente página / parte / vista del archivo, si leo parte del archivo usando MapViewOfFile?

Estoy tratando de usar una combinación de funciones CreateFileMapping, MapViewOfFile, FlushViewOfFile.

el tamaño total del búfer es mayor que la vista mapeada. El búfer de ejemplo es 50 KB. y la vista mapeada es de 2 KB. en tal escenario, quiero escribir el búfer total en un archivo físico, usando la función anterior.

Primera parte que puedo escribir en el archivo. pero la parte restante de cómo escribir en el archivo. Quiero decir, cómo pasar a la página siguiente y escribir la siguiente parte de los datos.

    #define MEM_UNIT_SIZE 100

-primer módulo ... Creador de mapas de memoria

GetTempPath (256, szTmpFile);

GetTempFileName (szTmpFile, pName, 0, szMMFile);
hFile = CreateFile (szMMFile, GENERIC_WRITE | GENERIC_READ, FILE_SHARE_WRITE,
        NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_TEMPORARY, NULL);
HANDLE hFileMMF = CreateFileMapping( hFile ,NULL,PAGE_READWRITE,0,
                   (MEM_UNIT_SIZE),pName)

-segundo módulo ... Escritor de memoria

    long lBinarySize = 1000;
    long lPageSize = MEM_UNIT_SIZE;

HANDLE hFileMMF = OpenFileMapping(FILE_MAP_WRITE,FALSE,pMemName);
LPVOID pViewMMFFile = MapViewOfFile(hFileMMF,FILE_MAP_WRITE,0,0, lPageSize );
CMutex mutex (FALSE, _T("Writer"));
mutex.Lock();

try
{
    ASSERT(FALSE);
    CopyMemory(pViewMMFFile,pBinary,lPageSize); // write 

    FlushViewOfFile(pViewMMFFile,lPageSize);  
           // first 100 bytes flushed to file. 
           //how to move to next location and  write next 900 bytes..<---??
}
catch(CException e)
{
    ...
}

por favor comparta si tiene alguna sugerencia. gracias de antemano, haranadh

preguntado el 08 de noviembre de 11 a las 13:11

publique su código hasta ahora para obtener consejos sobre cómo lograr los siguientes pasos:

Hola, también publiqué código. alguna ayuda de usted? también estoy buscando un código de muestra sobre cómo usar setEndOfFile. Gracias. -

Realmente no puedo mejorar los comentarios que recibiste de @ Jeremiah. ¿Sabe cómo obtener el tamaño del archivo para establecer un límite superior en su rango de mapeo? -

Lo siento, ¿no lo sé? porque, cuando lo intenté, está fallando en la segunda iteración. intentado de la siguiente manera: for (int n = 0; n

Cuando veo estas llamadas al sistema desprotegidas y nadie se preocupa por las llamadas al sistema fallidas, recuerdo noches de depuración de software escrito en C que de repente comenzaron a fallar. -

2 Respuestas

Repita su llamada a MapViewOfFile con un rango diferente.

respondido 08 nov., 11:17

Lamento volver a preguntar, diferentes medios de rango, necesito llamar a mapview del archivo varias veces ,? o cualquier puntero que se mueva a la cantidad de bytes, ¿qué debo hacer? gracias por tu respuesta. - Haranadh

@HaranadhGupta si su llamada original no especificó el rango completo del archivo, debe llamar a MapViewOfFile nuevamente. Para cualquier tamaño de archivo razonable, recomiendo simplemente mapear el archivo completo, ya que solo consume espacio de direcciones. Dado que parece que este puede ser un archivo nuevo, querrá usar SetEndOfFile para extender el archivo al tamaño apropiado antes de mapear la vista. ¿Eso ayuda? - Jeremiah Gowdy

No tengo control para especificar todo el rango de archivos, mientras se asigna. porque createFileMapping se hizo antes, y en ese momento no sé cuál podría ser el tamaño del archivo a mapear. estoy dando tamaño básico. cómo utilizar setEndOffile, en este escenario. Cualquiera que busque esa función en Google también. gracias por la ayuda - Haranadh

Intenté de la misma manera que repetir mi llamada usando MapViewOffile. Pero la segunda iteración no funciona. MapViewFile arroja un error de infracción de acceso como parte de getlasterror. los pls ayudan si es posible. Gracias - Haranadh

@HaranadhGupta Básicamente, cada vez que desee agregar más al archivo, anule la asignación de la vista, use SetEndOfFile para cambiar el tamaño del archivo para que sea más grande y luego reasigne la vista con el tamaño de archivo más grande. - Jeremiah Gowdy

como se describe en el siguiente enlace,

http://msdn.microsoft.com/en-us/library/windows/desktop/aa366761(v=VS.85).aspx

¿Puede comprobar la "granularidad de la asignación"? Creo que debería utilizar este parámetro para establecer los valores de "dwFileOffsetLow" o "dwFileOffsetHigh".

respondido 10 nov., 11:14

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.