我有一个很大的结构数组7G,为方便此后内存映射读入,想一次写盘,
但用WriteFile写超过4G的文件时,不成功。BOOL WriteFile(HANDLE hFile, // 文件句柄
LPCVOID lpBuffer, // 数据缓存区指针
DWORD nNumberOfBytesToWrite, // 要写的字节数 ****
LPDWORD lpNumberOfBytesWritten, // 用于保存实际写入字节数的存储区域的指针
LPOVERLAPPED lpOverlapped //
OVERLAPPED结构体指针 );DWORD nNumberOfBytesToWrite, 这个参数我用long long定义,足够大,但执行后就是一个DWORD内的余数部分写盘了。请教如何解决。
但用WriteFile写超过4G的文件时,不成功。BOOL WriteFile(HANDLE hFile, // 文件句柄
LPCVOID lpBuffer, // 数据缓存区指针
DWORD nNumberOfBytesToWrite, // 要写的字节数 ****
LPDWORD lpNumberOfBytesWritten, // 用于保存实际写入字节数的存储区域的指针
LPOVERLAPPED lpOverlapped //
OVERLAPPED结构体指针 );DWORD nNumberOfBytesToWrite, 这个参数我用long long定义,足够大,但执行后就是一个DWORD内的余数部分写盘了。请教如何解决。
xp、win7的ntfs系统,只要是32位的,都有4G文件限制,除非你升到64位系统,但那样可能现有的很多东西都要调整了
如果文件不见了。chkdsk就会显示。
可怜的孩子!!
我原来格式硬盘考虑不周,ntfs用的每扇区4094,似乎每个文件就不超过4G,我先重新找个分区,格式时用32K,再试试多次写盘。刚好在网上看到了一个似乎是这样的写盘的代码:DWORD dwNumberOfBytesWritten = 0;
int uDataSize = data.length();
while(uPos < uDataSize)
{
if(!WriteFile(hFile, pData + uPos, uDataSize - uPos, &dwNumberOfBytesWritten, NULL))
{
return ERROR;
}
uPos += dwNumberOfBytesWritten;
}
过其中的参数要用long long,有些地方还要改动。4楼的文章浏览了,是分块映射读入大文件的。我这内存足够大,一次可以整个映射G。内存价格低,多装内存省事。