如果我使用 MapViewOfFile 读取文件的一部分,如何获取文件的下一页/部分/视图?

发布于 2024-12-14 04:46:08 字数 1276 浏览 0 评论 0原文

我正在尝试使用 CreateFileMapping 、 MapViewOfFile 、 FlushViewOfFile 函数的组合。

总缓冲区大小大于映射视图。 示例缓冲区为 50KB。映射视图为 2KB。在这种情况下, 我想使用上述函数将总缓冲区写入物理文件。

第一部分我能够写入文件。但剩下的部分如何写入文件。我的意思是,如何移动到下一页并写入下一部分数据。

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

如果您有任何建议,请分享。 提前致谢, 哈拉纳德

I am trying to use combination of functions CreateFileMapping , MapViewOfFile, FlushViewOfFile.

the total buffer size is more than the mapped view.
example buffer is 50KB. and mapped view is 2KB. in such scenario,
i want to write the total buffer to a physical file, using the above function.

First part i am able to write to file. but the remaining part how to write to file. I mean, how to move to next page and write the next part of data.

    #define MEM_UNIT_SIZE 100

-first module...Memory map creator

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)

-second module... Memory writer

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

please share if you have any suggestion.
thanks in advance,
haranadh

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

非要怀念 2024-12-21 04:46:08

使用不同的范围重复调用 MapViewOfFile。

Repeat your call to MapViewOfFile with a different range.

謌踐踏愛綪 2024-12-21 04:46:08

如以下链接所述,

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

请检查“分配粒度”,我认为您应该使用此参数来设置“dwFileOffsetLow”或“dwFileOffsetHigh”的值。

as described in the following link,

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

can you please check "allocation granularity", I think you should use this parameter to set the values for "dwFileOffsetLow" or "dwFileOffsetHigh".

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文