Pnig0s p.s:大文件分割,使用内存映射文件,比传统分割方式快很多,目前支持最大3G文件的分割,下个版本改进支持64位最大16EB的文件。其实主要就是实践了下内存映射文件的方法。小Demo,写的糙了点儿,偶也是自己来分割Sql文件用的,莫笑。

使用方法在-h里写的很清楚了,大小是按KB来计算的,使用时稍微注意下。

 

 
  
  1. #include <stdio.h>  
  2. #include <iostream>  
  3. #include <Windows.h>  
  4. #include <time.h>  
  5. #include "head.h"  
  6. using namespace std;  
  7. int main(int argc,char * argv[]){  
  8.     HANDLE hInFile = INVALID_HANDLE_VALUE; //remain  
  9.     HANDLE hInMap;  
  10.     FILEINFO fi;  
  11.     BOOL bHelp = FALSE;  
  12.     DWORD dwPartSize;  
  13.     for(int i = 0;i<argc;i++){  
  14.         if(argc == 1){  
  15.             bHelp = TRUE;  
  16.         }  
  17.         LPSTR lpChkCmd= argv[i];  
  18.         LPSTR lpValue = argv[i+1];  
  19.         if(lstrcmp(lpChkCmd,"-f") == 0){  
  20.                 fi.lpFileName = lpValue;  
  21.         }else if(lstrcmp(lpChkCmd,"-s") == 0){  
  22.             dwPartSize = atol(lpValue)*1024;  
  23.         }else if(lstrcmp(lpChkCmd,"-h") == 0){  
  24.             bHelp = TRUE;  
  25.         }  
  26.     }  
  27.     if(bHelp){   
  28.         printf("\n --------------------------------");  
  29.         printf("\n|\tLarge file dividing\t|");  
  30.         printf("\n|\t\tby:Pnig0s1992\t|");  
  31.         printf("\n|\t\t2011,11,25\t|");  
  32.         printf("\n --------------------------------");  
  33.         printf("\nUsage:\n" 
  34.             "    %s -f div.txt -s 1024 \n" 
  35.             "Options:\n" 
  36.             "    -f         Specify the file u want to divide.\n" 
  37.             "    -s         Specify the size for each part(KB).\n" 
  38.             "    -h         Display the usage.\n",argv[0]);  
  39.         exit(1);  
  40.     }  
  41.     hInFile = CreateFile(fi.lpFileName,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);  
  42.     if(hInFile == INVALID_HANDLE_VALUE){  
  43.         printf("\n打开文件失败(%d).",GetLastError());  
  44.         return 0;  
  45.     }  
  46.     fi.dwFileLowSize = GetFileSize(hInFile,&fi.dwFileHighSize);  
  47.     fi.dwFileSize = fi.dwFileLowSize;  
  48.     hInMap = CreateFileMapping(hInFile,NULL,PAGE_READWRITE,0,0,NULL);  
  49.     if(hInMap == NULL){  
  50.         printf("\n创建源文件映射失败(%d).",GetLastError());  
  51.         CloseHandle(hInFile);  
  52.         return 0;  
  53.     }  
  54.     fi.dwPartNum = fi.dwFileSize / dwPartSize;  
  55.     if((fi.dwFileSize % dwPartSize ) != 0 ){  
  56.         fi.dwPartNum+=1;  
  57.     }  
  58.     printf("\n文件大小为:%uKB\t分块数为:%u\n",fi.dwFileSize/1024,fi.dwPartNum);  
  59.     DWORD dwCurAddr = 0;  
  60.     DWORD dwCurSize = 0;  
  61.     system("pause");  
  62.     DWORD dwBegin,dwFinish;  
  63.     dwBegin = GetTickCount();  
  64.     for(int index = 0;index<fi.dwPartNum;index++){  
  65.         dwCurSize = fi.dwFileSize - dwCurAddr;  
  66.         if(dwCurSize > dwPartSize){  
  67.             dwCurSize = dwPartSize;  
  68.         }  
  69.         LPVOID lpInMapContext;  
  70.         lpInMapContext = MapViewOfFile(hInMap,FILE_MAP_READ|FILE_MAP_WRITE,0,dwCurAddr,dwCurSize);  
  71.         if(!lpInMapContext){  
  72.             printf("\n创建源文件视图失败.(%d)",GetLastError());  
  73.             CloseHandle(hInFile);  
  74.             return 0;  
  75.         }  
  76.         dwCurAddr += dwCurSize;  
  77.         char cIndex[4];  
  78.         itoa(index+1,cIndex,10);  
  79.         HANDLE hOutFile;  
  80.         hOutFile = CreateFile(cIndex,GENERIC_ALL,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);  
  81.         if(hOutFile == INVALID_HANDLE_VALUE){  
  82.             printf("\n创建目标文件失败(%d).",GetLastError());  
  83.             return 0;  
  84.         }  
  85.         HANDLE hOutMap;  
  86.         hOutMap = CreateFileMapping(hOutFile,NULL,PAGE_READWRITE,0,dwCurSize,NULL);  
  87.         if(hOutMap == NULL){  
  88.             printf("\n创建目标文件映射失败(%d).",GetLastError());  
  89.             return 0;  
  90.         }  
  91.         LPVOID lpOutMapContext;  
  92.         lpOutMapContext = MapViewOfFile(hOutMap,FILE_MAP_WRITE,0,0,0);  
  93.         if(hOutMap == NULL){  
  94.             printf("\n创建目标文件视图失败.(%d)",GetLastError());  
  95.             return 0;  
  96.         }  
  97.         CopyMemory(lpOutMapContext,lpInMapContext,dwCurSize);  
  98.         printf("\n[MSG]分块%d完成.",index+1);  
  99.         UnmapViewOfFile(lpInMapContext);  
  100.         UnmapViewOfFile(lpOutMapContext);  
  101.         CloseHandle(hOutMap);  
  102.         CloseHandle(hOutFile);  
  103.     }  
  104.     CloseHandle(hInMap);  
  105.     CloseHandle(hInFile);  
  106.     dwFinish = GetTickCount();  
  107.     DWORD dwRunTime =dwFinish - dwBegin;  
  108.     printf("\n用时:%u毫秒",dwRunTime);  
  109.     return 1;