【问题标题】:C#/.NET: Creating a CAB and adding files to it without an external libraryC#/.NET:在没有外部库的情况下创建 CAB 并向其添加文件
【发布时间】:2026-02-08 10:10:02
【问题描述】:

我知道有一个similar question,但标记的答案提供了一个外部库的链接,该库需要在用户的计算机上安装多个依赖项。

我不需要提取或其他任何花哨的东西,例如列出文件 - 我只需将文件夹的全部内容添加到单个压缩文件中。我知道 cabinet.dll 存在于 \Windows\System32 文件夹中,我希望有一种简单的方法可以与此 DLL 进行交互以实现我想要做的事情。

是否可以在没有外部库的情况下做到这一点?如果有人能指出我正确的方向,我将永远感激不尽。

【问题讨论】:

    标签: c# .net cab kofax


    【解决方案1】:

    您可以查看WiX,更具体地说是Microsoft.Deployment.Compression.Cab 程序集。它有一个很好的 API 可以让你这样做:

    CabInfo cab = new CabInfo(@"c:\Work\some.cab"); 
    cab.Pack(@"C:\Work\folder");
    

    它依赖于独立的 Microsoft.Deployment.Compression 程序集,因此您只需要这两个程序集。

    【讨论】:

    • 我查看了 WiX,但它无法安装,因为我使用的是 VS2010 Beta 2。我希望能够发布不需要安装 WiX 等依赖项的东西.
    • 只需使用 LessMSIerables (blogs.pingpoet.com/overflow/archive/2005/06/02/2449.aspx) 从 MSI 中提取我提到的两个程序集并仅发送它们。
    • ...您不需要安装 WiX。
    • 哦,好吧,别介意我是 .net 新手 :) 我会尽快尝试。
    • Wix 现在似乎可以作为普通的 zip 文件使用了! wix.codeplex.com/releases
    【解决方案2】:

    上周我急于为一个项目创建一个 CAB 文件。我真正想要做的是替换现有 CAB 文件中的单个 XML 文件,保留 CAB 中的文件夹结构。我很快了解到,没有简单的 7Zip 或 WinZip 方法可以做到这一点,成功的途径是生成一个新的 CAB 文件,其中包含我想要的修改后的文件。这个从文件夹中的所有文件创建 CAB 文件的工具对我来说效果很好。它是 MakeCab 实用程序的 GUI 前端,它在此处描述:https://yieldreturnpost.wordpress.com/2016/06/22/free-tool-to-create-cab-file-from-folder/ GitHub 源码在这里:https://github.com/sapientcoder/CabMaker

    首先,我使用 Expand 命令将文件从现有 CAB 文件中提取到文件夹结构中。

    expand -F:* \\MyServer\ServerMigration2020\ExportedConfigurationSourceFiles\MyOriginalCABFile.cab \\MyServer\CaptureSV\ServerMigration2020\Cabfiles\CabSourceFiles 
    

    此扩展命令提取了我的 CAB 文件中的所有文件并将它们放在文件夹 CabSourceFiles 中,保留文件夹结构。

    现在,我们已准备好运行 CabMaker GUI 来创建我们的 CAB 文件。请注意,这是一个仅包含文件和文件夹的“普通”CAB 文件,而不是具有额外标题的文件和一组安装程序文件的一部分。

    我只是下载了 CabMaker C# 代码并在 Visual Studio 2019 中运行它。GUI 出现了。我输入了我的源文件夹(扩展命令中的输出文件夹)、我的目标文件夹(放置生成的 CAB 文件的位置)和我想要的 CAB 文件名,然后单击“制作 CAB”按钮,它运行了。生成的 CAB 文件运行良好,并成功导入到应用程序中,并产生了正确设置的配置。

    好的,那么为什么我需要制作一个 CAB 文件?好吧,我们正在将供应商应用程序从旧服务器迁移到新服务器,并使用应用程序的“导出”功能来捕获我们可以“导入”到新服务器上的应用程序的当前状态配置文件。另一种方法是使用消费者应用程序笨拙的 GUI 手动导航并对已更改的文件和文件夹名称进行数百次更改。我决定最好在包含所有设置的 CAB 中的 XML 文件中进行文件和文件夹更改。在服务器切换日这一切都很顺利;有时我们很幸运。向 GitHub 贡献者 SapientCoder 致敬!

    附:万一它对任何人有帮助,实际的应用程序是 Kofax Capture 10.1,涉及的 CAB 文件是由 Kofax 的导出功能创建的 CAB 文件,用于捕获 Kofax 系统的当前配置,包括 Kofax 批处理类、文档类、表单类型、用户, 和批次类分配的用户。因此,我将尝试在此处添加 Kofax 标签,以帮助有需要的人找到此答案。涉及的 XML 文件在源 Kofax 系统生成的 CAB 文件中被命名为“admin.xml”。我使用 NotePad++ 查找和替换在源和目标 Kofax 安装之间更改了 admin.xml 中的一堆 UNC 文件名引用。修改后的 CAB 文件在新服务器上的目标“新”Kofax 10.1 安装上运行良好,完全没有打嗝或问题。

    【讨论】:

    • 如果我首先看到 Darin Dimitrov 的答案,我可能会尝试这样做。我已经在使用 WiX 和 WixSharp,并且很欣赏这两种出色的工具。 WixSharp,又名 Wix#,是 Windows Installer XML 工具包(又名 WiX 工具包)的基于 C# 的前端,可用于使用 C# 语法构建 MSI 安装程序文件,而不是使用 XML 编写安装程序。请参阅infoq.com/articles/WixSharpgithub.com/oleg-shilo/wixsharp 了解更多信息。
    最近更新 更多