dwFileOffsetHigh和dwFileOffsetLow解释

时间:2015-01-07 14:45:29

标签: c++ 64-bit

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

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

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

这个CreateFileMapping ends with "Not enough disk space" error解释了“dwFileOffsetHigh和dwFileOffsetLow是两个32位值,它们组合在一起构成一个64位值。”

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

2 个答案:

答案 0 :(得分:2)

像这样提取低和高部分:

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

答案 1 :(得分:1)

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

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