问题标签 [system.io.compression]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
47 浏览

c# - 难以通过反射使用 System.IO.Compression.ZipArchive 访问可见属性

库加载,我可以在调试器中查看 ziparchiveentries,但我无法通过反射访问 ziparchiveentry 对象数组的方法或属性:

此时我可以在调试器中查看,例如:

然而例子:

返回错误:

0 投票
0 回答
150 浏览

c# - 如何在使用 c# 和 System.IO.Compression 压缩 zip 文件时取得进展

我需要在使用带有 System.IO.Compression 的 C# 压缩 zip 文件时获取 %。我有这个代码:

我需要用 Zip 压缩的百分比来更新 ProgressBar1。有可能的?

0 投票
1 回答
405 浏览

c# - System.IO.Compression - 使用 ZipFileArchive 计算文件数非常慢

为了用要提取的文件数更新进度条。我的程序正在检查一个 Zip 文件列表并收集其中的文件数量。合并后的文件数约为 22000 个。

我正在使用的代码:

但是,它看起来像是zip.Entries.Count在进行某种遍历,并且这个计数需要很长时间才能完成(如果互联网连接不好,则需要几分钟甚至更多)。

为了了解这可以改善多少,我将上面的内容与 7-Zip 的性能进行了比较。我拿了一个包含约 11000 个文件和文件夹的 zip 文件:

  1. 2 秒打开 7-Zip 存档。
  2. 1秒获取文件属性
  3. 在属性中,我可以看到 10016 个文件 + 882 个文件夹 - 这意味着需要 7-Zip ~3 秒才能知道 Zip 文件中有 10898 个条目。

7-Zip 属性

任何快速计算文件数量的想法、建议或任何替代方法将不胜感激。

  • 使用DotNetZip 计数实际上要快得多,但由于一些内部官僚问题,我无法使用它。我需要一个不涉及第三方库的解决方案,我仍然可以使用 Microsoft 标准库。
0 投票
0 回答
116 浏览

c# - Zip 文件运行良好,但仍然出现错误 System.IO.InvalidDataException: 'End of Central Directory record could not be found。

我在 System.IO.Compression 库中使用 ZipFile 方法。这是我编写的简单函数:

我可以在 Windows 资源管理器中手动解压缩文件,但是当我执行上述功能时,出现错误:

现在不太清楚如何解决这个问题。有人可以帮忙吗?

0 投票
1 回答
269 浏览

c# - 是否可以在创建 zip 文件时获取其大小?CreateEntryFromFile

我想知道是否可以检查动态创建的 zip 文件的大小,因为我正在读取一个目录并生成一个 19 MB 的 zip,我希望创建两个 zip,一个 10MB 和一个其他 9MB。但是,当我在循环内的 zip 文件中给出 .Length 时,它说大小为 0。当我完成添加文件时,它说是 19MB。有人知道该怎么做吗?

我只使用 System.IO.Compression 来完成这项任务。

这是一些例子来展示我是如何尝试的

0 投票
1 回答
218 浏览

javascript - 无法打开从 System.IO.Compression 命名空间创建的 zip 文件

我正在尝试压缩不同数量的文件,以便可以将一个 zip 文件夹提供给用户,而不必单击多个锚标记。我在 asp.net core 3.1 中使用 System.IO.Compression 命名空间来创建 zip 文件夹。

这是我用来创建 Zip 文件夹的代码。

我要压缩的文件是远程存储的,所以我用这段代码来抓取它们。InMemoryFile 是一个将文件名和文件字节组合在一起的类。

使用 Ajax 调用 DownloadPartFiles 方法。我使用 javascript 获取文件的远程路径及其各自的名称,并将它们传递给 Ajax 调用。

现在我一直遇到的问题是我无法在 Windows 10 中打开 zip 文件夹。每次我尝试使用 Windows 或 7-zip 打开 zip 文件夹时,都会收到一条错误消息,指出文件夹无法打开或文件夹无效。我试过在 stackoverflow 上查看各种类似的问题,即使用 System.IO.Compression 创建后的 zip 文件无效,但仍然无法弄清楚这是为什么。

会不会是编码?我发现 Ajax 期望它的响应被编码为 UTF-8,当我使用带有 UTF-8 的 notepad++ 查看 zip 文件时,我看到有指示损坏的字符。

对此的任何想法都会有所帮助。如果需要更多信息,请告诉我。

如果需要其中一个损坏的 zip 文件,我也可以提供。

编辑:

我已经改变了我在 javascript 中接收字节数组的方法。我正在使用 XMLHttpRequest 来接收字节数组。

根据我的阅读,Ajax 不是接收字节数组和二进制数据的最佳选择。使用这种方法,我可以使用 7-zip 打开一个 zip 文件,但不能打开 Windows,但是,存档中的一个文件显示为 0KB 大小并且无法打开。存档中的其他三个文件都很好。但是,其他具有不同文件的 zip 文件夹根本无法打开。

0 投票
1 回答
191 浏览

asp.net-core-3.1 - ZipArchive 不会立即刷新 zip 项目

我正在使用 ZipArchive + FileStream 创建一个 zip 文件。当新项目添加到 zip 文件中时,我想将新添加的项目刷新/写入到 zip 流下面。

下面的代码不会刷新单个 zip 项目。当 FileStream 处理时,整个 zip 被写入 output.zip。

0 投票
2 回答
102 浏览

c# - 压缩后无效的 C# Zip 文件

我正在编写代码以使用内置的 .NET 库在 C# 中压缩 ZIP 文件:

使用 System.IO.Compression;使用 System.IO;

但是,当压缩完成时,代码会输出一个无效的 zip 文件。似乎在代码中的某处,文件要么没有正确写入,要么完全关闭。我已经使用 dispose 和 close 来释放资源。

我会做错什么?是因为我强制扩展“.zip”吗?

0 投票
1 回答
131 浏览

wpf - 为什么 System.IO.Compression.ZipFile.ExtractToDirectory() 在 TeamCity 的 Artifact.zip 上抛出 InvalidDataException?

我最近将 Jetbrains Team City 更新到了 2020.2.2 版本。每当我将代码签入我的源存储库时,我都会使用它来构建我的项目。我使用 TeamCity API 来 DownloadAll 以检索包含构建生成的所有文件的 Artifacts.zip。

最近的更新中有一个错误,它破坏了下载的 Artifacts.zip 文件。

我现在收到InvalidDataException “本地文件头已损坏”。当我的程序调用System.IO.Compression.ZipFile.ExtractToDirectory()Artifacts.zip 文件时。

我可以右键单击这个相同的文件并使用内置的窗口“全部提取”解压缩它,也可以使用 7-Zip 解压缩到文件夹。这些没有问题,但由于某种原因,我的程序抛出了上述异常。

我在 Team City API 上使用以下命令来获取文件:https://{myserver}/httpAuth/repository/downloadAll/{myrepository}/{buildId}:id/artifacts.zip

有人知道为什么这会在 2021 年 2 月 1 日才开始发生吗?

0 投票
1 回答
293 浏览

c# - System.IO.Compression.ZipArchive 在处理后保持文件锁定?

我有一个从多个来源获取数据并将它们写入 ZIP 文件的类。我已经对课程进行了基准测试,以检查 usingCompressionLevel.Optimal是否会比CompressionLevel.Fastest. CompressionLevel但是每次我运行基准测试时,基准测试都会在不同的迭代和不同的值中引发异常。

我开始逐步删除添加文件内容的方法,直到我最终得到下面的代码(在 for 循环内),除了创建一个空的 zip 文件并删除它之外,它基本上什么都不做。

简化代码:

该循环在我的 PC 上运行了大约 100 到 15k 次迭代,然后在尝试删除文件时抛出 IOException,说明文件 ( result) 已锁定。

所以......我错过了一些关于如何使用的东西System.IO.Compression.ZipArchive吗?ZipArchive 没有关闭方法,使用应该处理/关闭存档...我尝试了不同的 .NET 版本 4.6、4.6.1、4.7 和 4.7.2。

编辑 1:不是基准代码的
一部分result.Delete()

编辑 2:
还尝试Thread.Sleep(5/10/20)在 using 块之后玩弄(因此result.Delete()要检查锁定是否仍然存在),但在 20 毫秒内,文件仍会在某些时候被锁定。没有尝试比 20ms 更高的值。

编辑 3:
无法在家中重现问题。在工作中尝试了十几次,循环从未达到 20k 次迭代。在这里尝试过一次,它完成了。

编辑4:
jdweng(见评论)是对的。谢谢!它在某种程度上与我在本地硬盘上的“e:”分区有关。相同的代码在本地 ssd 和网络共享上的“c:”分区上运行良好。