压缩流与解压流的问题(100分)

  • 主题发起人 主题发起人 kangshijiu
  • 开始时间 开始时间
K

kangshijiu

Unregistered / Unconfirmed
GUEST, unregistred user!
我的程序代码如下,怎么压缩出来的流是空的啊.
{
功能:压缩,将文件读入内存流中,再用压缩流压缩到另一内存流中,再将另一内存流写入目标文件
参数:FSrcFileName源文件, FDetFileName目标文件,FCompLevel压缩模式,返回压缩字节数
}
function TForm1.CompressFile(FSrcFileName, FDetFileName: String;
FCompLevel: TCompressionLevel):Integer;
var
CompStream: TCompressionStream;
InMemStream,OutMemStream: TMemoryStream;
count: Integer;
begin
Result := 0;
if (FSrcFileName='') or (FDetFileName='') then
begin
ShowMessage('源文件名或目标文件名不能为空!');
Exit;
end;
if not FileExists(FSrcFileName) or FileExists(FDetFileName) then
begin
ShowMessage('源文件不存在或目标文件已存在!');
Exit;
end;

InMemStream := TMemoryStream.Create;
OutMemStream := TMemoryStream.Create;
try
InMemStream.LoadFromFile(FSrcFileName);
count := InMemStream.Size;
CompStream := TCompressionStream.Create(FCompLevel,InMemStream);
try
//可以添加加密算法
CompStream.Write(OutMemStream,count); //??????怎么写出来是空流?
OutMemStream.SaveToFile(FDetFileName);
finally
FreeAndNil(CompStream);
end;
Result := count;
ShowMessage('文件' + FSrcFileName + '压缩成功,共压缩了' + IntToStr(Count) + ' 字节!');
finally
FreeAndNil(InMemStream);
FreeAndNil(OutMemStream);
end;
end;
 
你好像用反了:
CompStream := TCompressionStream.Create(FCompLevel,OutMemStream);
^^^^^^^^^^^^^^^^^此处是结果流
try
//可以添加加密算法
// CompStream.Write(OutMemStream,count); //??????怎么写出来是空流?
CompStream.copyfrom(InMemStream,count); //??????怎么写出来是空流?
 
你的参数写反了,TCompressionStream.Create的第2个参数是保存压缩后的数据的流

CompStream := TCompressionStream.Create(FCompLevel,OutMemStream);
try
//可以添加加密算法
CompStream.Write(InMemStream,count); //??????怎么写出来是空流?
OutMemStream.SaveToFile(FDetFileName);
finally
FreeAndNil(CompStream);
end;
 
楼主的错误主要有三, 正确写法如下
CompStream := TCompressionStream.Create(FCompLevel,OutMemStream); // 错误一, 语法错误, 已修正
try
//可以添加加密算法
CompStream.CopyFrom(InMemStream, Count); // 错误二, 语法错误, Stream.Write(stream...), 已修正
CompStream.Destroy ; // 错误三, 对compressStream理解错误, 必须Destroy后, 才能完成压缩, 已修正
OutMemStream.SaveToFile(FDetFileName);
finally
//FreeAndNil(CompStream);
end;
 
to 新世纪,第一个错误我懂了,但是压缩不是用write的吗?
 
都一样 write也行 copyfrom也行
关键是TCompressionStream类只能写,不能读,用哪种方法写无所谓
 
可以用Write, 但你直接使用write(InMemStream, Count)就错了, Buffer和Stream不是一回事
 
但是我改成这样,结果还是0字节:
InMemStream.LoadFromFile(FSrcFileName);
CompStream := TCompressionStream.Create(FCompLevel,OutMemStream);
try
//可以添加加密算法
count := CompStream.Write(InMemStream,InMemStream.Size);
OutMemStream.SaveToFile(FDetFileName);
finally
FreeAndNil(CompStream);
end;
 
是的,写不进去.
 
怎么改啊.
 
认真看看我的修正, 三个错误!!!
 
但是为什么要在输出前销毁解压流列?
InMemStream.LoadFromFile(FSrcFileName);
CompStream := TCompressionStream.Create(FCompLevel,OutMemStream);
try
//可以添加加密算法
count := CompStream.CopyFrom(InMemStream,InMemStream.Size);
OutMemStream.SaveToFile(FDetFileName);
finally
FreeAndNil(CompStream);
end;
 
InMemStream.LoadFromFile(FSrcFileName);
CompStream := TCompressionStream.Create(FCompLevel,OutMemStream);
try
//可以添加加密算法
count := CompStream.Write(InMemStream,InMemStream.Size);
finally
FreeAndNil(CompStream);
end;
//这句话放到外面
OutMemStream.SaveToFile(FDetFileName);
 
to hs-kill: 放到外面也可以,但是为什么要先销毁,目标流才可以有数据?
 
你问我,我问谁啊, Borland的TCompressStrem就是这样写的, 也有一定的道理,
每次写进数据并不是立即完成压缩, 而是到最后关闭的时候才将数据一起压缩到OutStream中
 
呵呵,谢谢
 

Similar threads

I
回复
0
查看
666
import
I
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部