如何使用 SevenZipSharp 创建压缩的 SFX 文件?

Posted

技术标签:

【中文标题】如何使用 SevenZipSharp 创建压缩的 SFX 文件?【英文标题】:How to create a compressed SFX file using SevenZipSharp? 【发布时间】:2013-04-17 20:17:45 【问题描述】:

我将了解如何使用 SevenZipSharp 库创建 SFX。

首先我要说我找不到任何属性来设置压缩级别,以及所有这些。

当我尝试制作文件的 SFX 时,我收到此错误:

"Object reference not set to an instance of an object."

如果我尝试制作文件夹的 SFX,我会收到以下错误:

"Access to the path 'C:\test' is denied."

(但不是真的,我是管理员,我已经使用更多可用文件夹对其进行了测试...)

这是我试图理解所有这些的完整课程...:

Imports SevenZip

Public Class Form1

Dim dll As String = "7z64.dll"

Private Function SevenZipSharp_Compress_SFX(ByVal Input_DirOrFile As String, _
                                            ByVal OutputFileName As String) As Boolean
    Try
        ' Set library path
        SevenZipCompressor.SetLibraryPath(dll)

        ' Create compressor
        Dim Compressor As SevenZipSfx = New SevenZipSfx(SfxModule.Default)

        ' Set SFX parameters
        ' ¿?

        ' Start compression
        Compressor.MakeSfx(Input_DirOrFile, OutputFileName)

    Catch ex As Exception
        'Return False ' File not compressed
        Throw New Exception(ex.Message)
    End Try

    Return True ' File compressed

End Function

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    SevenZipSharp_Compress_SFX("C:\test\file.bat", "C:\7zSFX.exe")
End Sub

End Class

更新:

@所有人:

请我祈祷有人会回答我的问题,至少你曾经创建一个 SFX SevenZipSharp 告诉我我做错了什么以及如何解决它,而不是回答说它们是用户权限问题,请阅读 cmets。

【问题讨论】:

在我看来,我注意到了一些事情:首先尝试设置断点,看看它到底在哪里失败。其次,您不能使用 SevenZip 压缩文件并将其保存为 .exe(在您的按钮单击事件中)。第三,我之前遇到过同样的情况(无法访问路径),后来发现这是一个权限问题。您是否真的进入了该文件夹的安全性并检查了自己的权限? 当然,就像我说的我确定这不是权限问题,我是管理员用户,我可以创建/删除/修改我想要的,我没有(从来没有)任何与我的操作系统中的用户权限相关的问题,我只对sevenzipsharp 有这个问题,这是一个 lier,我也用文件而不是文件夹对其进行了测试,然后它启动了一个不同的奇怪错误,你可以在我的问题中看到。任何其他经过测试的文件夹/文件也已打开或正在执行以启动该错误。 我不明白你说这个的原因:“其次你不能用 SevenZip 压缩文件并将其保存为 .exe(在你的按钮点击事件中)。”,你可以创建一个 SFX,以便我们可以将其保存为 exe,但它没有记录在案……我不知道该怎么做。谢谢你的评论。 【参考方案1】:

看起来对于参数应该是什么可能有些混淆。以下代码适用于codeplex 上的最新 SevenZipSharp 代码。

    Private Sub button1_Click(ByVal sender As Object, ByVal e As EventArgs)
        Dim compressor As SevenZipSfx = New SevenZipSfx("7z.sfx")
        compressor.MakeSfx("C:\Temp\cc_seal.7z", "C:\Temp\sfxseal.exe")
    End Sub

我在您的示例中尝试使用 SevenZipSfx(SfxModule.Default),但未设置模块名称,我相信这就是“对象引用未设置为对象实例”错误的来源,因为我这样做了:

    Private Sub button1_Click(ByVal sender As Object, ByVal e As EventArgs)
        Dim compressor As SevenZipSfx = New SevenZipSfx(SfxModule.Default)
        compressor.ModuleFileName = "7z.sfx"
        compressor.MakeSfx("C:\Temp\cc_seal.7z", "C:\Temp\sfxseal.exe")
    End Sub

它也对我有用,没有错误。取出 ModuleFileName 行,我遇到了和你一样的崩溃。

还要注意,compressor.MakeSfx 第一个参数需要是 .7z 文件而不是 .bat 文件。它会“工作”,但是当您尝试运行 sfx.exe 时,它​​会因为它不是有效的 7zip 文件而崩溃。所以你需要先压缩你的文件/目录。

确保 7z.sfx 在您的应用程序目录中,或提供它的路径(在 codeplex 源下载中)

我首先使用“7zxSD_All.sfx”文件进行了尝试,它提取了该文件,然后 Windows 7 给出了关于它未正确安装的错误(我假设 Windows 7 认为它是一个安装文件而不是自解压文件)。 “7z.sfx”虽然有效。

【讨论】:

【参考方案2】:

您可能使用的是 Windows 8,因此为了让您的应用程序有足够的权限在 (C:) 分区中进行写入修改,即使您是管理员,您也应该以“以管理员身份”模式运行应用程序。

【讨论】:

不,你是怎么得出这个结论的?,我在 Windows 7 中工作,就像我说的我从来没有遇到过任何用户权限问题(从来没有,任何),这不是权限问题,我不需要以管理员权限启动任何程序,因为我是合法管理员,我也可以对任何文件做任何事情(例如使用 DotNetZip 压缩),但我无法使用 Sevenzipsharp 制作 SFX ,就这么简单(但不知道解决方案是不是这么简单)。还是谢谢你 @For Everyone:请我祈祷有人会回答我的问题,至少你曾经创建过 SFX SevenZipSharp 告诉我我做错了什么以及如何解决它,而不是回答说是用户权限问题,请看cmets。 @ElektroHacker 毕竟,正如我所见,你有一个答案。但是,据您所知,我在回答之前阅读了 cmets。即使在使用管理员用户时,我在 Windows 8 中写入 C: 分区时也有相同的经验,我通过在管理员模式下运行应用程序解决了这个问题。与窗口 7 不同,使用管理员用户足以在 C: 分区内进行写入修改。祝你有美好的一天和代码! :-) 感谢大家的帮助,“请阅读 cmets”对您来说并不是一个特殊/讽刺的评论,只是对每个人的评论,因为我不会再回答说是用户权限问题. ps:对不起我的英语,谢谢!

以上是关于如何使用 SevenZipSharp 创建压缩的 SFX 文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Squid-Box.SevenZipSharp 在 C# 上压缩和解压缩文件 执行失败错误

SevenZipSharp的入门教程(包含如何加密压缩,解密压缩)

SevenZipSharp - 压缩内存流

使用 SevenZipSharp 压缩多卷?

[原]使用SevenZipSharp压缩/解压7z格式

如何使用 SevenZipSharp 提取多卷 7z 文件?