Как получить следующую страницу / часть / просмотра файла, если я прочитал часть файла с помощью MapViewOfFile?

#windows #visual-c #android-mapview #shared-memory #memory-mapped-files

#Windows #visual-c #android-mapview #разделяемая память #файлы, отображенные в памяти

Вопрос:

Я пытаюсь использовать комбинацию функций CreateFileMapping, MapViewOfFile, FlushViewOfFile.

общий размер буфера больше, чем отображенный вид. примерный буфер равен 50 КБ. а отображенный вид равен 2 КБ. в таком сценарии я хочу записать полный буфер в физический файл, используя вышеуказанную функцию.

Первую часть я могу записать в файл. но оставшуюся часть как записать в файл. Я имею в виду, как перейти на следующую страницу и записать следующую часть данных.

     #define MEM_UNIT_SIZE 100
  

-первый модуль…Создатель карты памяти

 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)
  

-второй модуль… Устройство записи в память

     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)
{
    ...
}
  

пожалуйста, поделитесь, если у вас есть какие-либо предложения.
заранее спасибо,
харанадх

Комментарии:

1. опубликуйте свой код, чтобы получить совет о том, как выполнить следующие шаги

2. Привет, я тоже опубликовал код. от вас есть помощь? также я ищу пример кода, как использовать SetEndOfFile. Спасибо.

3. Я не могу улучшить отзыв, который вы получили от @Jeremiah, на самом деле. Вы знаете, как получить размер файла, чтобы установить верхнюю границу диапазона отображения?

4. Извините, я не знаю? потому что, когда я попытался, на второй итерации произошел сбой. пробовал следующим образом: for(int n = 0; n<nCount; n) {DWORD dwFileOffsetHigh = 0; DWORD dwFileOffsetLow = lUnitSize*n; LPVOID pViewMMFFile = MapViewOfFile(hFileMMF,FILE_MAP_WRITE,dwFileOffsetHigh,dwFileOffsetLow,MEM_UNIT_SIZE) ;…..

5. Когда я вижу эти незащищенные системные вызовы и никому нет дела до неудачных системных вызовов, тогда я вспоминаю ночи отладки программного обеспечения, написанного на C, которое внезапно начало сбоить.

Ответ №1:

Повторите ваш вызов MapViewOfFile с другим диапазоном.

Комментарии:

1. извините, что спрашиваю еще раз, разный диапазон означает, что мне нужно вызвать mapview файла несколько раз,? или любой указатель, перемещающийся на количество байтов, что мне нужно сделать? спасибо за ваш ответ.

2. @HaranadhGupta если в вашем первоначальном вызове не был указан весь диапазон файла, вам нужно снова вызвать MapViewOfFile. Для любого разумного размера файла я рекомендую просто сопоставить весь файл, поскольку он занимает только адресное пространство. Поскольку похоже, что это может быть совершенно новый файл, вы захотите использовать SetEndOfFile для расширения файла до соответствующего размера перед отображением представления. Помогает ли это?

3. У меня нет контроля, чтобы указать для всего диапазона файла при отображении. поскольку CreateFileMapping выполняется раньше, и в то время я не знаю, каким может быть размер файла, который будет отображен. я даю базовый размер. как использовать SetEndOfFile в этом сценарии. в любом случае я тоже буду искать эту функцию в Google. спасибо за помощь

4. Я попробовал тот же способ, например, повторив свой вызов с помощью MapViewOfFile. Но на второй итерации это не работает. MapViewFile выдает ошибку нарушения доступа как часть getlasterror. пожалуйста, помогите, если это возможно. Спасибо

5. @HaranadhGupta В принципе, каждый раз, когда вы хотите добавить больше к файлу, отменяйте сопоставление представления, используйте SetEndOfFile, чтобы изменить размер файла на больший, а затем переназначайте представление с большим размером файла.

Ответ №2:

как описано в следующей ссылке,

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

не могли бы вы, пожалуйста, проверить «степень детализации распределения», я думаю, вам следует использовать этот параметр для установки значений «dwFileOffsetLow» или «dwFileOffsetHigh».