最近看了许多关于内存文件映射的文章,但总体的应用很少,没有看懂。想在这里问大家几个问题,希望大家不要见笑。
1、内存文件映射的步骤我不多说,只说一个MapViewOfFile函数,这个表示映射对象的一个视图,返回的是一个指针Pointer.
之后就是对这个指针进行操作。这里想问一下,我只知道一个指针,文件的结构是自己定义的。如何进行读写。网上大多数都说的通过StrCopy(..,..)指针转化成数组,然后对数组进行操作。来达到写数据目的。不知我理解是否正确。如果一个文件的结构是我自己定义的,请问我应该使用这个指针去进行读写呢?
2、关于TStream。大多数人都知道这是最常用的文件读写操作。但是就是将数据读到内存中的。
 流只有两个属性: Size、Position.
当我创建一个空的 mStream:=TMemoryStream.Create; 流时
1、能否将内存文件映射中的GetSize的大小赋值给mStream.Size?2、能否将内存文件映射中的MapViewOfFile返回的指针指向mStream.Position;
 mStream.Position:=MapViewOfFile(..........);????我这样做想达到的目的是,通过映射出的地址去访问物理文件,然后文件的写操作还是通过文件流去完成。希望大家给点好的建议。主要是对内存映射的读写文件确实不太熟悉。

解决方案 »

  1.   

    1.MapViewOfFile  返回的Pointer.你可以直接 type
    TMyType = Record
      AData....
    end;
    pTMyType =^TMyType;
    var
    pMyVar : pTMyType ;
    begin
    pMyVar := MapViewOfFile ....然后你直接操作(读/写)pMyVar就可以了
    完全可以把它当普通指针操作(除了Free...)
    2、关于TStream 
      TMemoryStream.Size是可写的
    也就是你可以 
    M := TMemoryStream.Create;
    M.Size := 1024;
    mStream.Position:=MapViewOfFile(..........);????
    这样感觉没什么意义
    因为Position是个mStream当前读写位置的指针
    而 MapViewOfFile 返回的是 MapViewOfFile将硬盘文件映射到内存中数据开始的地址
    或许 这是你想要的
    mStream.Memory := MapViewOfFile...
    mStream.Memory 是 mStream 的内存中数据开始的地址 和MapViewOfFile返回的类似
    可mStream.Memory 是只读的.
    mStream.Memory := MapViewOfFile... 就被编译器和谐了..
    前面说了MapViewOfFile 返回的Pointer你可以当你自己GetMem返回的Pointer用
    所以也就不用 mStream.Position:=MapViewOfFile 了
    或许你喜欢用Stream操作
    那样有个办法 只是感觉在饶圈
    还不如直接用FileStream
    方法是
    P := MapViewOfFile ;
     M := TMemoryStream.Create;
    M.Size := MapViewOfFileSize;
    Move(P^,M.Memory^,M.Size);
    //你的操作代码
    Move(M.Memory^,P^,M.Size);
    M.Free;
    UnMapView******
      

  2.   

    To bdmh:
       每次在CSDN上都能看见你的回答,可就是没有具体点的代码之类的。能不能给点可行的代码,让我们这些菜鸟从实际的上去学习。
       希望写点delphi 代码,能直接复制过去运行的代码好不??
      

  3.   

    随手写的,例如一个DAT文件,结构里面有这些变量,
    var DownPath:String[255]   //URL下载地址
    var md5:String[16];        //文件MD5
    var .......假设你现在要取得md5的值时
    CreateFile(...);
    CreateFileMapping(...)
    ViewPointer := MapViewOfFile(...) 
    p1:=pbyte(ViewPointer)+255;//指针位置+255即是md5处,
    往后读取16位即是md5的值,