谁告诉我高位文件跟低文件该怎么设置  
 DWORD dwMaximumSizeHigh,            //高位文件大小   
  DWORD dwMaximumSizeLow,             //低位文件大小   
内存映射文件超过了1G就不行了。我想分部分来做,可搞不定。麻烦会的朋友解决下 

解决方案 »

  1.   

    内存映射文件超过了1G就不行了
    ------------------------
    怎么會呢,記得內存映射大約可支持16EB的大小。
    至於高低們的設置是,一個64位值中,较高的32位传递给参数dwFileOffsetHigh,较低的32位传递给参数dwMaximumSizeLow。
      

  2.   

    參考下這個鏈接吧
    http://www.ai86.cn/book/windows_kernel/17.htm
      

  3.   

    没法映射到进程地址呀
    FH:=FileOpen(Edit2.Text,fmOpenRead);
    MH:=CreateFileMapping(FH,nil,Page_ReadOnly,0,FileSize,nil);
    CloseHandle(FH);
    MP:=MapViewOfFile(MH,File_Map_Read,0,0,FileSize);   这里返回的值为NIL了,
    CloseHandle(MH);
      

  4.   

    兄弟,你在MapViewOfFile的時候就不能使用整個文件的大小了,你可以分小塊來進行多次映射(比如使用多線程)
      

  5.   

    CreateFileMapping可以創建整個文件大小的map,但是創建視圖MapViewOfFile時遇到大文件時就必須多次了
      

  6.   

    dwFileOffsetHigh
    Specifies the high-order 32 bits of the file offset where mapping is to begin. dwFileOffsetLow
    Specifies the low-order 32 bits of the file offset where mapping is to begin. The combination of the high and low offsets must specify an offset within the file that matches the system's memory allocation granularity, or the function fails. That is, the offset must be a multiple of the allocation granularity. Use the GetSystemInfo function, which fills in the members of a SYSTEM_INFO structure, to obtain the system's memory allocation granularity. 
    ---------------------------------
    這兩個參數就是起始位置,dwNumberOfBytesToMap參數就是要映射的字節數量
      

  7.   

    假如我一次映射600M   又要怎样从600M那个位置开始呢?
    ----------------
    已經很明白了,MapViewOfFile時,dwFileOffsetHigh 和dwFileOffsetLow 參數指定起始位置,dwNumberOfBytesToMap參數就是要映射的字節數量。
    至於源碼,我也沒時間寫,如果你理論看懂了,不至於寫不出來的.
      

  8.   

    还没搞定吗?
    下面是我写的一段利用内存映射技术复制文件的代码,已经用一个3G多的文件测试通过,你可以参考一下.procedure TForm1.MapMemoryFileCopy(SourceFileName, TargetFileName: string);
    const
      BufferSize=1024*1024*64;
    var
      SourceHandle:THandle;               //源文件句柄
      TargetHandle:THandle;               //目标文件句柄
      FSize:Cardinal;                     //文件大小
      sMapHandle:THandle;                 //源文件内存映射句柄
      tMapHandle:Thandle;                 //目标文件内存映射句柄
      PSource:Pointer;                    //源文件内存映射视图地址
      PTarget:Pointer;                    //目标文件内存映射视图地址
      StartPos:Cardinal;
      MapSize:Cardinal;
    begin
      //源文件
      SourceHandle:=fileopen(SourceFileName,fmOpenRead);
      FSize:=GetFileSize(SourceHandle,nil);
      sMapHandle:=CreateFileMapping(SourceHandle,nil,PAGE_READONLY,0,FSize,nil);
      CloseHandle(SourceHandle);
      //目标文件
      TargetHandle:=FileCreate(TargetFileName);
      tMapHandle:=CreateFileMapping(TargetHandle,nil,PAGE_READWRITE,0,FSize,nil);
      CloseHandle(TargetHandle);  //初始化变量
      StartPos:=0;
      MapSize:=BufferSize;  while StartPos<FSize do
      begin
        if StartPos+BufferSize>FSize then
          MapSize:=FSize-StartPos;
        //创建映射视图,获得的PSource和PTarget指针,可以和操作普通指针一样进行内存操作
        PSource:=MapViewOfFile(sMapHandle,FILE_MAP_READ,0,StartPos,MapSize);
        PTarget:=MapViewOfFile(tMapHandle,FILE_MAP_READ or FILE_MAP_WRITE,0,
                  StartPos,MapSize);
        //复制
        move(PByte(PSource)^,PByte(PTarget)^,MapSize);
        StartPos:=StartPos+MapSize;
        //取消内存映射视图
        UnMapViewOfFile(PSource);
        UnMapViewOfFile(PTarget);
      end;
      //关闭文件映射
      CloseHandle(sMapHandle);
      CloseHandle(tMapHandle);
    end;
      

  9.   

    手工改了一下,沒有調試,不知道能否正常運行procedure TForm1.MapMemoryFileCopy(SourceFileName, TargetFileName: string);
    const
      BufferSize=1024*1024*64;
    var
      SourceHandle:THandle;               //源文件句柄
      TargetHandle:THandle;               //目标文件句柄
      FSize:Cardinal;                     //文件低32位大小
      HighSize:Cardinal;                  //文件高32位大小
      TotalSize:int64;                    //文件總體積
      sMapHandle:THandle;                 //源文件内存映射句柄
      tMapHandle:Thandle;                 //目标文件内存映射句柄
      PSource:Pointer;                    //源文件内存映射视图地址
      PTarget:Pointer;                    //目标文件内存映射视图地址
      StartPos:Int64;
      MapSize:Cardinal;
    begin
      //源文件
      SourceHandle:=fileopen(SourceFileName,fmOpenRead);
      FSize:=GetFileSize(SourceHandle,@HighSize);
      TotalSize:=HighSize*1024*1024*1024*4+FSize;
      sMapHandle:=CreateFileMapping(SourceHandle,nil,PAGE_READONLY,0,TotalSize,nil);
      CloseHandle(SourceHandle);
      //目标文件
      TargetHandle:=FileCreate(TargetFileName);
      tMapHandle:=CreateFileMapping(TargetHandle,nil,PAGE_READWRITE,0,TotalSize,nil);
      CloseHandle(TargetHandle);  //初始化变量
      StartPos:=0;
      MapSize:=BufferSize;  while StartPos<TotalSize do
      begin
        if StartPos+BufferSize>TotalSize then
          MapSize:=TotalSize-StartPos;
        //创建映射视图,获得的PSource和PTarget指针,可以和操作普通指针一样进行内存操作
        PSource:=MapViewOfFile(sMapHandle,FILE_MAP_READ,0,StartPos,MapSize);
        PTarget:=MapViewOfFile(tMapHandle,FILE_MAP_READ or FILE_MAP_WRITE,0,
                  StartPos,MapSize);
        //复制
        move(PByte(PSource)^,PByte(PTarget)^,MapSize);
        StartPos:=StartPos+MapSize;
        //取消内存映射视图
        UnMapViewOfFile(PSource);
        UnMapViewOfFile(PTarget);
      end;
      //关闭文件映射
      CloseHandle(sMapHandle);
      CloseHandle(tMapHandle);
    end;
      

  10.   

    再修改了一下,有設置高位,但沒有調試過,LZ調試下,有問題再說。procedure TForm1.MapMemoryFileCopy(SourceFileName, TargetFileName: string);
    const
      BufferSize=1024*1024*64;
    var
      SourceHandle:THandle;               //源文件句柄
      TargetHandle:THandle;               //目标文件句柄
      FSize:Cardinal;                     //文件低32位大小
      HighSize:Cardinal;                  //文件高32位大小
      TotalSize:int64;                    //文件總體積
      sMapHandle:THandle;                 //源文件内存映射句柄
      tMapHandle:Thandle;                 //目标文件内存映射句柄
      PSource:Pointer;                    //源文件内存映射视图地址
      PTarget:Pointer;                    //目标文件内存映射视图地址
      StartPos:Int64;
      MapSize:Cardinal;
      function MakeInt64(high,low:Cardinal):int64;
      begin
        move(pchar(@high)^,pchar(longint(@result)+sizeof(cardinal))^,sizeof(cardinal));
        move(pchar(@low)^,pchar(@result)^,sizeof(cardinal));
      end;  function High32(num:int64):Cardinal;
      begin
        move(pchar(longint(@num)+sizeof(cardinal))^,pchar(@result)^,sizeof(cardinal));
      end;  function Low32(num:int64):Cardinal;
      begin
        move(pchar(@num)^,pchar(@result)^,sizeof(cardinal));
      end;
    begin
      //源文件
      SourceHandle:=fileopen(SourceFileName,fmOpenRead);
      FSize:=GetFileSize(SourceHandle,@HighSize);
      TotalSize:=HighSize*1024*1024*1024*4+FSize;
      sMapHandle:=CreateFileMapping(SourceHandle,nil,PAGE_READONLY,HighSize,FSize,nil);
      CloseHandle(SourceHandle);
      //目标文件
      TargetHandle:=FileCreate(TargetFileName);
      tMapHandle:=CreateFileMapping(TargetHandle,nil,PAGE_READWRITE,HighSize,FSize,nil);
      CloseHandle(TargetHandle);  //初始化变量
      StartPos:=0;
      MapSize:=BufferSize;  while StartPos<TotalSize do
      begin
        if StartPos+BufferSize>TotalSize then
          MapSize:=TotalSize-StartPos;
        //创建映射视图,获得的PSource和PTarget指针,可以和操作普通指针一样进行内存操作
        PSource:=MapViewOfFile(sMapHandle,FILE_MAP_READ,High32(StartPos),Low32(StartPos),MapSize);
        PTarget:=MapViewOfFile(tMapHandle,FILE_MAP_READ or FILE_MAP_WRITE,
                       High32(StartPos),Low32(StartPos),MapSize);
        //复制
        move(PByte(PSource)^,PByte(PTarget)^,MapSize);
        StartPos:=StartPos+MapSize;
        //取消内存映射视图
        UnMapViewOfFile(PSource);
        UnMapViewOfFile(PTarget);
      end;
      //关闭文件映射
      CloseHandle(sMapHandle);
      CloseHandle(tMapHandle);
    end;
      

  11.   

    剛才測試了一下,上面的程序OK,但是沒有用大於4G的文件測試,應該也是OK的