最近看了许多关于内存文件映射的文章,但总体的应用很少,没有看懂。想在这里问大家几个问题,希望大家不要见笑。
1、内存文件映射的步骤我不多说,只说一个MapViewOfFile函数,这个表示映射对象的一个视图,返回的是一个指针Pointer.
之后就是对这个指针进行操作。这里想问一下,我只知道一个指针,文件的结构是自己定义的。如何进行读写。网上大多数都说的通过StrCopy(..,..)指针转化成数组,然后对数组进行操作。来达到写数据目的。不知我理解是否正确。如果一个文件的结构是我自己定义的,请问我应该使用这个指针去进行读写呢?
2、关于TStream。大多数人都知道这是最常用的文件读写操作。但是就是将数据读到内存中的。
流只有两个属性: Size、Position.
当我创建一个空的 mStream:=TMemoryStream.Create; 流时
1、能否将内存文件映射中的GetSize的大小赋值给mStream.Size?2、能否将内存文件映射中的MapViewOfFile返回的指针指向mStream.Position;
mStream.Position:=MapViewOfFile(..........);????我这样做想达到的目的是,通过映射出的地址去访问物理文件,然后文件的写操作还是通过文件流去完成。希望大家给点好的建议。主要是对内存映射的读写文件确实不太熟悉。
1、内存文件映射的步骤我不多说,只说一个MapViewOfFile函数,这个表示映射对象的一个视图,返回的是一个指针Pointer.
之后就是对这个指针进行操作。这里想问一下,我只知道一个指针,文件的结构是自己定义的。如何进行读写。网上大多数都说的通过StrCopy(..,..)指针转化成数组,然后对数组进行操作。来达到写数据目的。不知我理解是否正确。如果一个文件的结构是我自己定义的,请问我应该使用这个指针去进行读写呢?
2、关于TStream。大多数人都知道这是最常用的文件读写操作。但是就是将数据读到内存中的。
流只有两个属性: Size、Position.
当我创建一个空的 mStream:=TMemoryStream.Create; 流时
1、能否将内存文件映射中的GetSize的大小赋值给mStream.Size?2、能否将内存文件映射中的MapViewOfFile返回的指针指向mStream.Position;
mStream.Position:=MapViewOfFile(..........);????我这样做想达到的目的是,通过映射出的地址去访问物理文件,然后文件的写操作还是通过文件流去完成。希望大家给点好的建议。主要是对内存映射的读写文件确实不太熟悉。
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******
每次在CSDN上都能看见你的回答,可就是没有具体点的代码之类的。能不能给点可行的代码,让我们这些菜鸟从实际的上去学习。
希望写点delphi 代码,能直接复制过去运行的代码好不??
var DownPath:String[255] //URL下载地址
var md5:String[16]; //文件MD5
var .......假设你现在要取得md5的值时
CreateFile(...);
CreateFileMapping(...)
ViewPointer := MapViewOfFile(...)
p1:=pbyte(ViewPointer)+255;//指针位置+255即是md5处,
往后读取16位即是md5的值,