gpt4 book ai didi

Delphi TZipFile 提取零字节文件

转载 作者:行者123 更新时间:2023-12-01 17:10:21 24 4
gpt4 key购买 nike

使用 Delphi XE2 和 native TZipFile,我尝试提取下载的 zip 文件的内容(其中包含 2 个压缩的 XML 文件),它总是提取零字节文件。

该文件正在由 C# 代码压缩,如下所示:

var zipFile = new ZipFile();
foreach (Tuple<string, string> t in filesMeta) {
zipFile.AddFile(string.Format("{0}{1}", StaticVariables.WebServerFileStorage, t.Item2), "").FileName = t.Item1 + ".xml";
}
response.Clear();
response.ContentType = "application/zip";
zipFile.Save(response.OutputStream);
response.End();

Delphi提取代码是这样的:

zipFile := TZipFile.Create;
try
filename := 'C:\test\57f52480-ec87-4169-a820-0a65bc4ad952.zip';
if zipFile.IsValid(filename) then begin
zipFile.Open(filename, zmRead);
zipFile.ExtractAll('C:\test\');
end;
finally
zipFile.Free;
end;

我什至尝试使用 TStream 作为源而不是磁盘上的文件。这实际上就是我想要做的,因为 zip 文件是从 Web 服务器下载到 TStream 中的。我尝试使用 TZipFile 的重载 open 方法打开流来提取数据。

这给了我零字节文件,因此我将 zip 文件保存到磁盘并尝试从磁盘打开该文件并解压。提取相同的零字节文件。

我什至尝试使用类方法从磁盘上的 zip 文件中提取文件:

System.Zip.TZipFile.ExtractZipFile(filename, 'C:\Test\');

提取相同的零字节文件。

该 zip 文件有效,并且 Windows 7 native 文件处理和 7-Zip 都可以正确提取 2 个压缩的 XML 文件。

现在有一些疯狂的事情......

绝望中我试图看看 ExtractToFile() 过程是什么 David Heffernan 在这个问题中提出了关于 extracting a zip to a stream我会这样做,我尝试像这样使用它:

var x : integer;
var fileCount : integer;
var fileNames : TArray<string>;
begin
zipFile := TZipFile.Create;
try
filename := 'C:\test\57f52480-ec87-4169-a820-0a65bc4ad952.zip';
if zipFile.IsValid(filename) then begin
zipFile.Open(filename, zmRead);
fileCount := zipFile.FileCount;
fileNames := copy(zipFile.FileNames, 0, MaxInt);
zipFile.Close;

for x := 0 to fileCount-1 do begin
// Use David Heffernan's stream procedure
ExtractToFile(filename, x, 'C:\test\' + fileNames[x]);
end;
end;
finally
zipFile.Free;
end;
end;

David 的程序按预期将文件提取到磁盘! WTF???

我真的很困惑为什么复杂的提取方法可行而简单的提取方法行不通。如果有必要的话,我会使用大卫的例子,但如果可能的话,我更愿意让正常的提取工作。

任何想法都会受到赞赏。

干杯!TJ

最佳答案

我也遇到了同样的问题。

TZipFile 的源代码显示,传递到 Read 函数的 TStream 返回整个 zip 文件,并将位置设置为所需文件名的开头。所以不要倒带。只需复制或使用 TStream 对 TZipHeader 中给出的未压缩长度执行您想要的操作。

ZipStream := TStream.Create;
ZipFile.Read(MyFileName, ZipStream, ZipHeader);
//leave ZipStream pointer where it is!!!
SomethingElse.LoadFromStream(ZipStream, ZipHeader.UncompressedSize);
ZipStream.Free;

在我看来,TZipFile 应该只加载 ZipStream 所请求的内容。如果不先查看 TZipFile 源代码,这种实现方式并不直观。

关于Delphi TZipFile 提取零字节文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43372428/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com