如何使用 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# 上压缩和解压缩文件 执行失败错误