【发布时间】:2021-12-06 08:30:53
【问题描述】:
我最近迁移到 Delphi 11.0 这一行 'Zip.CopyFrom(Source, 0);生成'错误'无效的ZStream操作'
uses system.ZLib;
...
const
ZLIB_GZIP_WINDOWBITS = 31;
ZLIB_DEFLATE_WINDOWBITS = 15;
type
TZLibCompressionLevel = TZCompressionLevel;
procedure ZLibCompressStream(Source, Dest: TStream; const Level: TZLibCompressionLevel;
const GZipFormat: Boolean);
var
WindowBits: Integer;
Zip: TZCompressionStream;
begin
if GZipFormat then
WindowBits := ZLIB_GZIP_WINDOWBITS
else
WindowBits := ZLIB_DEFLATE_WINDOWBITS;
Zip := TZCompressionStream.Create(Dest, Level, WindowBits);
try
Zip.CopyFrom(Source, 0);
finally
FreeAndNil(Zip);
end;
end;
procedure TForm85.Button1Click(Sender: TObject);
var s1,s2:TMemoryStream;
begin
s1:=TMemoryStream.Create;
s1.LoadFromFile('h:\1.txt') ;
s2:=TMemoryStream.Create;
ZLibCompressStream(s1,s2,zcDefault,true);
end;
在 Delphi 10 上和没有错误发生之前
【问题讨论】:
-
我们可以假设
1.txt实际上的大小大于零吗?如果您查看https://docwiki.embarcadero.com/Libraries/Alexandria/en/System.Classes.TStream.CopyFrom,您会注意到 Embarcadero 可能已经更改了其中的代码。去看看有什么区别。同样在示例中;https://docwiki.embarcadero.com/CodeExamples/Alexandria/en/ZLibCompressDecompress_(Delphi)压缩部分在CopyFrom中有一个计数。它以前可能与0一起使用,但新的更改可能不会 -
我的文件大小是 5k 并使用其他文件大小和格式进行测试,但结果没有发生变化。我编译了这个例子
-
使用 Embarcadero® Delphi 11.0 版本 28.0.42600.6491 并出现相同的错误“无效的 ZStream 操作”Tstream.Copyfrom 与 tmemorystream 一起正常工作,但对于 TZcompressionStream 上升错误。我再次提到,此代码在 Delphi 10.2 上编译没有任何问题,基于 embarcadero 注释“在版本 11 中,该方法已经过优化,现在可以在大计数的情况下获得更好的性能。”由于 embarcadero 工作人员未针对 TZcompressionStream 测试此优化例程,因此需要发布新版本
-
值得注意的是,在Delphi 10和Delphi 11上输出TZcompressionStream的结果是正确的,可以解压没有任何错误
-
同样更新Delphi到1.November解决不了这个错误,问题存在。
标签: delphi