tfilestream的缓冲区怎么还有限制???(50分)

  • 主题发起人 主题发起人 easemind
  • 开始时间 开始时间
E

easemind

Unregistered / Unconfirmed
GUEST, unregistred user!
谁知道,
我声明了一个2m的数组,用来做缓冲区,提示错误,如果是1m,正常,怎么会这样!!!
 
我要处理大于10m的文件,而且希望一次全进缓冲区,应该怎么办,同时还有写入大于10m
的情况,应该怎么处理
 
有必要分配那么大的数组作缓冲区吗?并不是说缓冲区越大,速度就越快的
对于 FAT32 来说,2-4K 的缓冲区应该是最快的。
 
我是说对文件大小有限制!!!!
 
我需要把一个文件完全读进内存!!!
 
那也不需要缓冲区呀,直接
aFileStream := TFileStream.Create('filename', fmOpenRead)
不就行了?
TFileStream 对文件大小是没有限制的!你分配缓冲区的大小限制是数组的问题
与 TFileStream 无关

不过推荐使用文件映射,对大文件操作特别快。
 
我认为你用文件流,缓存不能太大,10K就够了,
 
请问 beta 兄,你说的使用文件映射的方法是怎么样实现的,能给段例子吗
 
to SupermanTm:如下函数返回指向文件内容缓冲区开始处的指针(对大文件尤为试用)

function MapFile(FileName: string): Pointer;
var
hFile, hMap: THandle;
FileSize: Integer;
os: OFSTRUCT;
begin
hFile := OpenFile(PChar(FileName), os, OF_READWRITE);
FileSize := GetFileSize(hFile, nil);
hMap := CreateFileMapping(hFile, nil, PAGE_READWRITE or SEC_COMMIT,
0, FileSize, PChar(FileName));
Result := MapViewOfFile(hMap, FILE_MAP_WRITE, 0, 0, FileSize);
CloseHandle(hFile);
end;
 
谢谢 beta 兄,可是用完了以后需要释放些什么资源吗?
 
aFileStream := TFileStream.Create('filename', fmOpenRead)


我当然知道,问题是我感觉,这样并没有把10m的文件全部放到内存里面。
所以,我设了一个很大的数组,想把文件内容读到数组缓冲去里面,但是只能指定读1m

一超过2m就提示错误。

 
//这样并没有把10m的文件全部放到内存里面。
当然放进去了,不用担心:)

to SupermanTM,需要一下两句:
UnmapViewOfFile(刚才的函数返回的指针);
CloseHandle(hMap)
// 刚才忘记了把 hMap 定义为全局的:)
 
谢谢 beta 兄
 
多人接受答案了。
 

Similar threads

I
回复
0
查看
540
import
I
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部