不多說了,10G+的Sql測試分割成功,每塊大小不要超過1G就好了。
//Code by Pnig0s1992
//Date:2012,3,18
#include <stdio.h>
#include <Windows.h>
#define MAXLENGTH 30
int main(int argc,char * argv[])
{
LPTSTR lpFileName = "xxx.sql";
HANDLE hFile;
struct FILEINFO
{
LONGLONG llFileSize;
LONG llPartSize;
DWORD dwPartNum;
};
FILEINFO fi;
fi.llFileSize = 0;
fi.llPartSize = 0;
fi.dwPartNum = 0;
fi.llPartSize = 1024*1024;
hFile = CreateFile(lpFileName,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
if(hFile == INVALID_HANDLE_VALUE)
{
printf("\n獲得文件句柄失敗%d。",GetLastError());
return -1;
}
LARGE_INTEGER uli = {0};
SYSTEM_INFO SysInfo;
GetSystemInfo(&SysInfo);
DWORD dwGran = SysInfo.dwAllocationGranularity;
LONGLONG qwFileOffset = 0;
LONGLONG dwBlockBytes = fi.llPartSize;
if(GetFileSizeEx(hFile,&uli))
{
fi.llFileSize = uli.QuadPart;
fi.dwPartNum = fi.llFileSize/dwBlockBytes;
if((fi.llFileSize%dwBlockBytes) != 0)
{
fi.dwPartNum+=1;
}
printf("\n文件:%s 大小為:%I64d KB",lpFileName,uli.QuadPart/1024);
printf("\n分塊大小:%u KB 分塊數:%u",(dwBlockBytes/1024),fi.dwPartNum);
}
HANDLE hFileMap;
hFileMap = CreateFileMapping(hFile,NULL,PAGE_READONLY,0,0,NULL);//超大文件時該處失敗
if(hFileMap == NULL)
{
printf("\n創建文件映射對象句柄失敗:%d。",GetLastError());
CloseHandle(hFile);
return -1;
}
LPSTR sTempStr = (LPSTR)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,MAXLENGTH);
for(int index = 0;index<fi.dwPartNum;index++)
{
LPVOID lpMapStartPos;
if(fi.llFileSize < dwBlockBytes)
{
dwBlockBytes = fi.llFileSize;
}
lpMapStartPos = MapViewOfFile(hFileMap,FILE_MAP_READ,0,qwFileOffset,dwBlockBytes);
if(lpMapStartPos == NULL)
{
printf("\n映射目標文件到內存失敗:%d。",GetLastError());
CloseHandle(hFileMap);
CloseHandle(hFile);
return -1;
}
qwFileOffset += dwBlockBytes;
fi.llFileSize -= dwBlockBytes;
sprintf(sTempStr,"%s_%d",lpFileName,index+1);
HANDLE hNewFile = CreateFile(sTempStr,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
if(hNewFile == INVALID_HANDLE_VALUE)
{
printf("\n獲取分塊文件對象句柄失敗:%d。",GetLastError());
UnmapViewOfFile(lpMapStartPos);
CloseHandle(hFileMap);
CloseHandle(hFile);
return -1;
}
HANDLE hNewFileMap;
hNewFileMap = CreateFileMapping(hNewFile,NULL,PAGE_READWRITE,0,dwBlockBytes,NULL);
if(hNewFile == NULL)
{
printf("\n獲取分塊文件內存映射對象句柄失敗:%d。",GetLastError());
UnmapViewOfFile(lpMapStartPos);
CloseHandle(hNewFile);
CloseHandle(hFileMap);
CloseHandle(hFile);
return -1;
}
LPVOID lpNewFilePos = MapViewOfFile(hNewFileMap,FILE_MAP_WRITE,0,0,0);
if(lpNewFilePos == NULL)
{
printf("\n映射分塊文件到內存失敗:%d。",GetLastError());
UnmapViewOfFile(lpMapStartPos);
CloseHandle(hNewFileMap);
CloseHandle(hNewFile);
CloseHandle(hFileMap);
CloseHandle(hFile);
return -1;
}
CopyMemory(lpNewFilePos,lpMapStartPos,dwBlockBytes);
printf("\n分塊文件%s成功生成。",sTempStr);
CloseHandle(hNewFileMap);
CloseHandle(hNewFile);
UnmapViewOfFile(lpMapStartPos);
UnmapViewOfFile(lpNewFilePos);
}
CloseHandle(hFileMap);
CloseHandle(hFile);
system("pause");
return 0;
}
本文出自 “About:Blank H4cking” 博客,請務必保留此出處http://pnig0s1992.blog.51cto.com/393390/809886