我正在尝试将文件写入磁盘,但是当我尝试写入大于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位大小的文件?
答案 0 :(得分:2)
像这样提取低和高部分:
uint64_t size = ...;
uint32_t sizeLow = size & 0xffffffff;
uint32_t sizeHigh = size >> 32;
答案 1 :(得分:1)
从64位整数中提取32位部分的最简单和最清晰的方法可能是使用LARGE_INTEGER
或ULARGE_INTEGER
,如MSDN所示:
ULARGE_INTEGER maxSize;
maxSize.QuadPart = size; /* your 64-bit value here */
fileMap = CreateFileMapping(fileHandle, NULL, PAGE_READWRITE,
maxSize.HighPart, maxSize.LowPart, NULL);