- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
使用 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/
使用 Delphi XE2 和 native TZipFile,我尝试提取下载的 zip 文件的内容(其中包含 2 个压缩的 XML 文件),它总是提取零字节文件。 该文件正在由 C# 代码压缩,如下
Delphi XE5 TZipFile 是否能够处理加密/密码保护的 zip 文件?或者用户必须使用第三方软件来处理这个问题? 如有任何帮助,我们将不胜感激。 最佳答案 查看System.Zip的源代
当您尝试读取 TZipFile.FileComment 时,编译器报告这将无法编译:[dcc64 错误] Unit1.pas(451): E2010 不兼容的类型:“string”和“System.T
使用 TZipFile 类(我使用 ExtractAll 方法)从 zip 中提取的文件将系统日期时间作为创建/修改文件的日期,但我需要恢复原始时间戳,就像 winzip/winrar 那样。 TZi
我们目前正在使用 ZipTV 进行文件压缩。我们正在努力消除第三方组件,以便轻松升级到较新的 Delphi 版本。我们遇到了 System.Zip.TZipFile,但在 XE7 Delphi Too
使用System.Zip.TZipFile提取ZIP文件时: System.Zip.TZipFile.ExtractZipFile('C:\test.zip', 'R:\_TEST\'); 对于特定的
我想用 Delphi XE2/XE3 标准 System.Zip 单元替换 zip 存档中的文件(= 删除旧文件并添加新文件)。但没有替换/删除方法。有谁知道如何在不需要提取所有文件并将它们添加到新存
我正在使用 Embarcadero C++Builder 10.1 Berlin Update 2。我正在使用 System.Zip.TZipFile.ExtractAll() 来提取一个大的 .zi
我是一名优秀的程序员,十分优秀!