dwFileOffsetHigh 和 dwFileOffsetLow 解释道

dwFileOffsetHigh and dwFileOffsetLow explained

本文关键字:解释 dwFileOffsetLow dwFileOffsetHigh      更新时间:2023-10-16

我正在尝试将文件写入磁盘,但是当我尝试写入大于 4 GB 的文件时它崩溃了。我目前正在使用通话:

fileMap= CreateFileMapping( fileHandle, NULL, PAGE_READWRITE, 0, (DWORD)size, NULL );

我认为这就是问题所在。阅读文档,它说我可以使用 dwMaximumSizeHigh 和 dwMaximumSizeLow 通过此调用保存 64 位大小的文件。我有点困惑这些是如何工作的?

此 CreateFileMapping 以"磁盘空间不足"错误结尾,说明"dwFileOffsetHigh 和 dwFileOffsetLow 是两个 32 位值,组合形成一个 64 位值。

那么如何将一个值传递给这个函数,为 64 位文件创建一个足够大的文件映射呢?我尝试为最小和最大传递两个 (DWORD) 大小,但它仍然崩溃。我将如何使用此功能创建大于 32 位大小的文件?

从 64 位整数中提取 32 位部分的最简单、最清晰的方法可能是使用 MSDN 上所示的LARGE_INTEGERULARGE_INTEGER

ULARGE_INTEGER maxSize;
maxSize.QuadPart = size; /* your 64-bit value here */
fileMap = CreateFileMapping(fileHandle, NULL, PAGE_READWRITE,
                            maxSize.HighPart, maxSize.LowPart, NULL);

像这样提取低部分和高部分:

uint64_t size = ...;
uint32_t sizeLow = size & 0xffffffff;
uint32_t sizeHigh = size >> 32;