如何在不实际提取文件的情况下使用 VBScript 读取 .zip 文件的内容?

Posted

技术标签:

【中文标题】如何在不实际提取文件的情况下使用 VBScript 读取 .zip 文件的内容?【英文标题】:How to read the contents of a .zip file with VBScript without actually extracting the files? 【发布时间】:2011-01-18 12:39:01 【问题描述】:

我有一个以父目录开头的 .zip 文件。我需要从文件中读取该目录,然后搜索我的 HD 以查看该目录名称是否已存在。如果存在,我将其删除并替换为 .zip 文件的内容。

所有这些我都可以做,除了读取 .zip 而不实际解压缩文件。

.zip 文件的大小可以超过 2G,所以我想避免解压缩,然后读取目录,然后复制。

我不直接解压缩到该位置并强制覆盖的原因是,由于某种原因,当使用CopyHere 方法解压缩时,它忽略了通常会强制覆盖的开关,并且仍然提示用户如果他们想覆盖。

解压文件的代码:

 Set objSA = CreateObject("Shell.Application")
 Set objSource = objSA.NameSpace(pathToZipFile).Items ()
 Set objTarget = objSA.NameSpace(extractTo)     

 objTarget.CopyHere objSource,4

【问题讨论】:

【参考方案1】:

这是关于 SO 的类似问题。How to list the contents of a .zip folder in c#?

我自己使用过这个库。它运行良好,http://dotnetzip.codeplex.com/,甚至还有一个树视图示例,似乎无需提取即可读取 zip。

您将需要服务器上的 DLL,但我不会说您必须安装它们。 ;)

【讨论】:

【参考方案2】:

您可以在您的objSource 对象上使用For Each,例如:

Dim objSA, objSource, item
Set objSA = CreateObject("Shell.Application")
Set objSource = objSA.NameSpace(pathToZipFile).Items ()
For Each item in objSource
    WScript.Echo item
Next 

【讨论】:

【参考方案3】:

假设您可以使用外部应用程序,请尝试下载7Zip,然后使用-l 开关让您的脚本执行它。这应该会为您提供一些您应该能够以某种方式解析的输出。

帮助文件示例:7z l archive.zip

【讨论】:

我想我把它变成了半工作状态。仍在努力,但这似乎是最有希望的【参考方案4】:

我不确定是否可以在不解压缩的情况下读取 zip 的内容。

如果您只是想避免对数据进行耗时的复制操作,您可以尝试解压缩到临时目录,然后使用“移动”功能。移动通常比复制耗时更少,因为它实际上不会重新写入磁盘上的数据。它只是更新文件系统以指向数据所在的位置。

【讨论】:

我尝试过的一切都不起作用。问题是我可以有 10 个需要按顺序应用的 .zip 文件(软件补丁)。如果要打补丁的系统已经有补丁1-5,那我就不用再浪费时间解压了,检查,删除,再试试。就目前而言,这可能就是我最终要做的。要么就是这样,要么让客户相信,如果用户必须点击按钮来确认覆盖,那也没关系。 不能从压缩包文件名判断补丁版本吗?只需将拉链命名为合理的名称即可。 我希望它是那么简单。每个补丁在 zip 下都有不同的起始目录,通常与实际的补丁名称无关。

以上是关于如何在不实际提取文件的情况下使用 VBScript 读取 .zip 文件的内容?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在不使用临时文件的情况下在批处理文件中嵌入和执行 VBScript?

如何在不实际创建数据库的情况下将在线可用数据库 API 中的数据提取到 firebase 数据库中? [关闭]

是否可以在不实际渲染画布的情况下创建画布来提取图像数据?

如何在不提取Java的情况下读取压缩文件的内容

如何在不使用 python 保留目录的情况下提取文件夹中的所有 .zip 扩展名?

如何在不提取的情况下从 zip 设置图片框图像位置?