unit Unit1; interface uses Windows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,Dialogs,StdCtrls,zlib; type TForm1 = class(TForm) Button1: TButton; Memo1: TMemo; Memo2: TMemo; Button2: TButton; Button3: TButton; Button4: TButton; Button5: TButton; Button6: TButton; Button7: TButton; Button8: TButton; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); procedure Button5Click(Sender: TObject); procedure Button6Click(Sender: TObject); procedure Button7Click(Sender: TObject); procedure Button8Click(Sender: TObject); private mStream: TMemoryStream; { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} type TRec = record name: string[8]; age: word; end; function SplitFile(const FileName:string; Size: Cardinal): Boolean; var fStream: TFileStream; {原始文件} toStream: TMemoryStream;{分文件} p,i: Integer; {p 记录当前指针位置; i 记录这是第几个分的文件} begin Result := False; Size := Size * 1024; {把大小的单位转换为字节} fStream := TFileStream.Create(FileName,fmOpenRead); p :=0; i :=0; toStream := TMemoryStream.Create; while p < fStream.Size do begin toStream.Clear; {清空上次数据} fStream.Position := p;{放好指针位置} if fStream.Size-p < Size then Size := fStream.Size-p;{最后一个时,有多少算多少} toStream.copyFrom(fStream,Size);{复制} toStream.SavetoFile(FileName +'.' + IntToStr(i)); {保存} Inc(i); p := p + Size; end; fStream.Free; toStream.Free; Result := True; end; //合并文件,参数是其中一个分文件名 function MergeFile(const FileName:string): Boolean; var ms: TMemoryStream; {读取分文件} fs: TFileStream; {合并后的文件} path:string; i: Integer; begin path := ChangeFileExt(FileName,'');{去掉序号扩展名} ShowMessage(path); i :=0; ms := TMemoryStream.Create; fs := TFileStream.Create(path,fmCreate); while FileExists(path +'.' + IntToStr(i))do begin ms.LoadFromFile(path +'.' + IntToStr(i)); fs.copyFrom(ms,0);{TFileStream 不需要 SetSize; 但如果用 TMemoryStream 就需要} Inc(i); end; ms.Free; fs.Free; end; // Zlib;//压缩函数 //procedure Zip(var fs: TMemoryStream); procedure Zip(var fs: TMemoryStream); var cs: TCompressionStream; ms: TMemoryStream; num: Integer; begin if not(Assigned(fs)and (fs.Size>0))then Exit; num := fs.Size; ms := TMemoryStream.Create; cs := TCompressionStream.Create(clMax,ms); try fs.SavetoStream(cs); cs.Free; //ms.Position := 0; fs.Clear; fs.WriteBuffer(num,sizeof(num)); fs.copyFrom(ms,0); finally ms.Free; end; end; //解压函数 procedure UnZip(var fs: Tmemorystream); var ds: TDecompressionStream; ms: TMemoryStream; num: Integer; begin if not(Assigned(fs)and (fs.Size>0))then Exit; fs.Position :=0; fs.ReadBuffer(num,sizeof(num)); ms := TMemoryStream.Create; ds := TDecompressionStream.Create(fs); try ms.SetSize(num); ds.Read(ms.Memory^,num); //ms.Position := 0; fs.Clear; fs.copyFrom(ms,0); finally ds.Free; ms.Free; end; end; procedure TForm1.Button1Click(Sender: TObject); var pc: PChar; buffer: array[0..7] of char; begin pc := mStream.Memory; // showmessage(pc[0]); // showmessage(pc[6]); // showmessage(pc[7]);//回车换行占2个 // 从流到缓存去 mStream.Seek(10,soFromBeginning); mstream.Read(buffer,sizeof(buffer)); showmessage(buffer); end; procedure TForm1.FormCreate(Sender: TObject); var strList: TStringList; begin mStream := TMemoryStream.Create; strList := TStringlist.Create; strList.Add('aaaaaaaa'); strList.Add('bbbbbbbb'); strList.Add('cccccccc'); strList.Add('dddddddd'); strList.SavetoFile('Stream.txt'); strList.Free; mStream.LoadFromFile('Stream.txt'); Memo1.Lines.LoadFromStream(mStream); end; procedure TForm1.FormDestroy(Sender: TObject); begin mStream.Free; end; procedure TForm1.Button2Click(Sender: TObject); begin mStream.Position := 4; showmessage(inttoStr(mStream.Position)); showMessage(inttoStr(mStream.Size)); Memo2.Lines.LoadFromStream(mStream); end; procedure TForm1.Button3Click(Sender: TObject); var sGetPath,sToPath: string; getStream,setStream :TFileStream; begin sGetPath := '证件照.jpg'; sToPath := '证件照1.jpg'; if not FileExists(sGetPath) then begin showmessage('找不到我们要测试的照片:'+ sgetpath); exit; end; //TFileStream 打开模式与共享模式: //分类 参数 说明 //fmCreate 建立文件,如果存在则打开它。 //fmOpenRead 只读打开 //fmOpenWrite 只写打开 //fmOpenReadWrite 读写打开 //----------------------- //fmShareCompat 共享模式,兼容 Dos //fmShareExclusive 不允许别人以任何方式打开 //fmShareDenyWrite 允许别人以只写方式打开 //fmShareDenyRead 允许别人以只读方式打开 //fmShareDenyNone 允许别人以任何方式打开 getStream := TFileStream.Create(sGetPath,fmOpenRead or fmShareExclusive); setStream := TFileStream.Create(sTopath,fmCreate); setStream.copyFrom(getStream,getStream.Size); getStream.Free; setStream.Free; end; procedure TForm1.Button4Click(Sender: TObject); begin //writeComponentResFile('memo1.dat',memo1); {只此一句就可以把当前的 Memo 的状态序列化到文件} memo1.Lines.Clear; readComponentResFile('memo1.dat',memo1); {一句话就可以读回,不管是经过了什么操作(甚至是关机)} end; procedure TForm1.Button5Click(Sender: TObject); var stream : TStream; begin memo1.Lines.clear; // 序列化与反序列化 // stream := TFileStream.Create('m.dat',fmCreate); // stream.WriteComponentRes(memo1.ClassName,memo1); stream := TFileStream.Create('m.dat',fmOpenRead); stream.ReadComponentRes(memo1); stream.Free; end; procedure TForm1.Button6Click(Sender: TObject); var rec: Trec; ms: TMemoryStream; begin ms := TMemoryStream.Create; // rec.name := '张三'; // rec.age := 8; // byte 8 位, word 16 位; longword 32 位,相当于 cardinal // ms.Write(rec,sizeof(rec)); // rec.name := '李四'; // rec.age := 81; // byte 8 位, word 16 位; longword 32 位,相当于 cardinal // ms.Write(rec,sizeof(rec)); // rec.name := '裴晓斌'; // rec.age := 25; // byte 8 位, word 16 位; longword 32 位,相当于 cardinal // ms.Write(rec,sizeof(rec)); // ms.SavetoFile('rec.dat'); // 读取 ms.LoadFromFile('rec.dat'); memo1.Clear; ms.Position :=0; while ms.Position < ms.Size do begin ms.Read(rec,sizeof(rec)); memo1.Lines.Add(rec.name + ' ' + inttostr(rec.age)); end; ms.Free; end; // 压缩流 与 解压缩流 procedure TForm1.Button7Click(Sender: TObject); var cs: TCompressionStream; fs,ms: TMemoryStream; num: integer; begin fs := TMemoryStream.Create; fs.LoadFromFile('证件照.jpg'); num := fs.Size; ms := TmemoryStream.Create; ms.Write(num,sizeof(num)); cs := TCompressionStream.Create(clMax,ms); fs.SavetoStream(cs); cs.Free; ms.SavetoFile('1.zipx'); ms.Free; fs.Free; end; // 文件的压缩与解压 procedure TForm1.Button8Click(Sender: TObject); var ds: TDecompressionStream;{解压流} fs,ms: TMemoryStream; {fs 是准备要解压的流; ms 是接受解压数据的流} num: Integer; {接受文件压缩前的大小} begin {第一步: 准要解压的文件} fs := TMemoryStream.Create; fs.LoadFromFile('1.zipx');{必须是上一个压缩方法生成的文件} {第二步: 读出文件压缩前的大小} fs.Position :=0; fs.ReadBuffer(num,SizeOf(num)); {第三步: 准备好要接收的流,并设置需要的大小} ms := TMemoryStream.Create; ms.SetSize(num); {第四步: 解压} ds := TDecompressionStream.Create(fs);{参数是要解压的流} {第五步: 把解压后的数据读出存放到已准备好接收的流} ds.Read(ms.Memory^,num); {第六步: 保存} ms.SavetoFile('2.jpg'); ds.Free; ms.Free; fs.Free; end; end.