C#/ .NET:创建CAB并在没有外部库的情况下向其添加文件

时间:2009-12-21 11:41:47

标签: c# .net cab

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

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

没有外部库可以做到这一点吗?如果有人能指出我正确的方向,我会永远感激。

2 个答案:

答案 0 :(得分:9)

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

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

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

答案 1 :(得分:0)

上周我急着为一个项目创建一个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 

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

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

我只是下载了CabMaker C#代码并在Visual Studio 2019中运行它。GUI出现了。我输入了Source文件夹(Expand命令中的输出文件夹)和Target文件夹(放置了生成的CAB文件的位置),并输入了所需的CAB文件名,然后单击“ Make CAB”按钮,它开始运行。生成的CAB文件运行良好,并成功导入到应用程序中,并导致正确设置了配置。

CabMaker GUI screen shot

确定,为什么为什么需要制作一个CAB文件?好吧,我们正在将供应商应用程序从旧服务器迁移到新服务器,并使用该应用程序的“导出”功能来捕获当前状态配置文件,我们可以将其“导入”到新服务器上的应用程序中。替代方法是使用使用者应用程序的笨拙GUI手动浏览并对已更改的文件和文件夹名称进行数百次更改。我决定最好在保存所有设置的CAB中的XML文件中更改文件和文件夹。在服务器交接日,一切工作都很顺利;有时候我们很幸运。 GitHub贡献者SapientCoder的主要荣誉!

P.S。如果可以帮助任何人,则实际的应用程序是Kofax Capture 10.1,涉及的CAB文件是由Kofax的导出功能创建的CAB文件,用于捕获Kofax系统的当前配置,包括Kofax批处理类,文档类,表单类型,用户和批处理类分配的用户。因此,我将尝试在此处添加Kofax标记,以防有需要的人找到此答案。涉及的XML文件在由源Kofax系统生成的CAB文件中名为“ admin.xml”。我使用NotePad ++查找和替换在源和目标Kofax安装之间的admin.xml中更改了一堆UNC文件名引用。修改后的CAB文件可以很好地在新服务器上的目标“新” Kofax 10.1安装上很好地工作,根本没有任何打h或问题。