TmemoryStream问题,等待!!!!!!!!!!!!!!!(100分)

  • 主题发起人 主题发起人 tuboo
  • 开始时间 开始时间
T

tuboo

Unregistered / Unconfirmed
GUEST, unregistred user!

为什么以下两种执行结果不一样呢?

var
Fstream: Tmemorystream;
ps: integer;
mychar: char;
mystr: String;
begin
try
Fstream := Tmemorystream.create;
Fstream.LoadFromfile(filename);
mystr := '';
for ps := 0 to 4 do
beign
Fstream.seek(ps,sofrombeginning);
Fstream.Read(mychar,1);
Mystr := Mystr + mychar;
end;
finally
Fstream.free;
end;
showmessage(mystr);
end;


var
Fstream: Tmemorystream;
mystr: String[5];
begin
try
Fstream := Tmemorystream.create;
Fstream.loadfromfile(filename);
Fstream.seek(0,sofrombeginning);
Fstream.Read(mystr,5);
finally
Fstream.free;
end;
showmessage(mystr);
end;

我猜想二是错误的,那么怎么简化一的操作呢?

另外,Fstream(TmemoryStream对象)载入一个超大的文件会出现什么情况?这个文件大过
在任务管理器里面显示的最大内存量,例如我的任务管理器里面显示的最大内存
为300000K,而文件A的大小为400000K,当我调用 Fstream.loadfromfile(A)的时候
会出现什么情况?
那么怎么避免,一下子载入一个超大文件,而又能判断该文件的第N个字节开始
的一段是否为一个特定的字符串呢? 例如我要判断文件A的第200个字节开始的四个字节
是否为'good',我又不想一下子把整个文件A都载入到Fstream中【因为A有
400000k大】,那么我该怎么做?
各位大侠,多谢了!!!!!!!!!!!
 
估计系列会自动处理,超大文件也许它会放到磁盘缓冲中
读文件有很多种方式,为什么要用内存流的方式呢
 
我想我要判断,这个文件的第n个字节开始的某段是否为一个特定的字符串,内存流应该是
最好的方法了? 还有别的什么好方法吗,还请大侠指点!
 
Seek+ReadBlock和WriteBlock就可以了呀
 
这个流没关系,和字符串的处理有关,你将第二中改为

var
Fstream: Tmemorystream;
mystr: String[5];
begin
try
Fstream := Tmemorystream.create;
Fstream.loadfromfile(filename);
Fstream.seek(0,sofrombeginning);
Fstream.Read(mystr[1],5);
mystr[0] := Chr(5);
finally
Fstream.free;
end;
showmessage(mystr);
end;


 
其实用文件流更好,可以处理较大的文件,代码可以改为

var
Fstream: TStream;
mystr: String[5];
begin
try
Fstream := TFileStream.create('filename', fmOpenRead);
Fstream.seek(0,sofrombeginning);
Fstream.Read(mystr[1],5);
mystr[0] := Chr(5);
finally
Fstream.free;
end;
showmessage(mystr);
end;
 
在处理的瞬间,文件流会占用比如说【400000k】的磁盘空间吗?,如果空间不够不是会出错?
 

超过 50M 就千万别用 TMemoryStream 全部载入内存
用内存映射,非常快
 
还请beta君,讲解一下内存映射技术。:)
 
procedure TestMap(FileName: string);
const
sMapName = 'beta''s test';
var
hFile, hMap: THandle;
FilePtr: Pointer;
lpROB: TOFStruct;
begin
hFile := OpenFile(PChar(FileName), lpROB, OF_READ);
hMap := CreateFileMapping(hFile, nil, PAGE_READONLY, 0, BuffSize, sMapName);
FilePtr := MapViewOfFile(hMap, FILE_MAP_READ, 0, 0, BuffSize);
// 现在 FilePtr 就是指向文件缓冲区的首地址,直接对这个指针操作就可以了

// 记得释放
UnmapViewOfFile(FilePtr);
CloseHandle(hMap);
CloseHandle(hFile);
end;

 
什么意思?不太明白

>>在处理的瞬间,文件流会占用比如说【400000k】的磁盘空间吗?,如果空间不够不是会出错?
 
多谢各位!内存映射及文件流(我的需求并不涉及频繁的操作)都是可以的
 
后退
顶部