您的位置:首页 > 编程语言 > Delphi

delphi中关于流的学习

2016-02-19 18:31 561 查看
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.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Delphi7