如何在不实际提取文件的情况下使用 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 数据库中? [关闭]