type
  Tmapinfo=record
      info1:string[255];
      info2:string[255];
  end;
var  hMap: THandle;
  pInfo: Pointer;
begin
  hMap := CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE or SEC_COMMIT,
    0, MapSize, 'abc');
  pinfo:=mapviewoffile(hMap,FILE_MAP_ALL_ACCESS,0,0,MapSize);end;1.请问如何在映射文件的最后插入一个Tmapinfo类型的数据(如何判断文件已经到了末尾?)
2.如何在映射文件的任意位置插入一个Tmapinfo类型的数据
3.怎样知道映射文件的长度,(相当于对文件操作时的filesize函数)
谢谢!

解决方案 »

  1.   

    创建一个内存映射文件就是相当于得到了一块内存,pinfo就是指向这块内存的指针.结构体就相当于一个模板一样.如
    PMyTest=^TMyTest;
    TMyTest=record
     Int:integer;
     DateTime:TDateTime
     Str:String[10];
    end;只要内存中有一块区域保存的数据结构是这样:前四个字节为数字,后面8个字节数据符合日期类型的要求,在后面的10个字节是字符,就可以将这个认为是TMyTest所以:要想插入一个结构,只要在想要的位置=PMyTest ,然后直接写入.当然自己要清楚在这块区域各个部分到底保存了什么内容.
      

  2.   

    建立映射文件之后,如何判断已经到了文件末尾。我要依次读取文件中的每一个“单元”,但我又不能用filesize来取文件的大小,怎样循环呢,谢谢
      

  3.   

    文件大小在创建映射文件时就确定了.
    function CreateFileMapping(hFile: THandle; lpFileMappingAttributes: PSecurityAttributes;
      flProtect, dwMaximumSizeHigh, dwMaximumSizeLow: DWORD; lpName: PChar): THandle;
    dwMaximumSizeHigh和dwMaximumSizeLow确定文件的最大字节数,
    function MapViewOfFile(hFileMappingObject: THandle; dwDesiredAccess: DWORD;
      dwFileOffsetHigh, dwFileOffsetLow, dwNumberOfBytesToMap: DWORD): Pointer; stdcall;
    dwFileOffsetHigh和 dwFileOffsetLow确定数据文件中哪个字节做为视图的第一个字节,dwNumberOfBytesToMap确定要映射多少字节的地址空间.对于你上面写的代码MapSize就是文件总大小.
      

  4.   

    我的 MapSize是通过filesize函数获得的,实际中我把它设为0,这样是自适应文件大小。filesize函数等于是又读了一次硬盘上的文件,我现在想实现的是硬盘文件映射到内存中之后,仍然可以在内存中依次读取各个“单元”,可我不知道我映射文件的大小,无法用循环!